struct结构体内存大小

转自http://www.cnblogs.com/xieyajie/p/8094788.html

概括:

一. 基本原则

1. struct中成员变量的声明顺序,与成员变量对应的内存顺序是一致的;

2. struct本身的起始存储地址必须是成员变量中最长的数据类型的整倍数,注意是最长的数据类型,而不是最长的变量(对于数组只看类型不看元素个数)

3. 内存对齐与编译器设置有关。

二. 计算规则(以下的所有规则,必须同时满足,并不是满足其中一条即可

1. 每个成员变量相对于struct起始地址的偏移量,必须是成员变量自身类型长度的最小整倍数

2. 结构体内存大小,必须是成员变量中类型长度最长者的整倍数,如果不是,则在最后一个成员变量后补齐

3. 成员变量是数组时,按照类型长度对齐,而不是数组长度对齐(如int a[10]的类型长度为int型,即为4)

4. 成员变量是结构体时,根据struct基本原则,其存储偏移量必须是成员变量最长的数据类型的整倍数(当进行规则2的判断时,结构体变量也是使用成员变量中最长类型,结合上边几条规则,这个其实很好理解的)

转载于:https://www.cnblogs.com/InductiveSorting-QYF/p/10815717.html

### 计算C/C++ Struct结构体内存大小 在C/C++中,`sizeof`操作符用于获取数据类型的字节数。对于结构体而言,其实际占用的内存量不仅取决于成员变量本身的大小,还受到编译器填充(padding)的影响。 #### 成员排列与对齐原则 为了提高访问速度,编译器会按照特定规则调整结构体内部各字段的位置: - **自然对齐**:每个基本类型都有自己的默认对齐需求,比如char(1), short(2), int(4), long/float(4), double(8),指针通常也是机器字长。 - **最大对齐单位**:整个结构体会根据最宽的基本类型来决定最终的整体对齐方式[^2]。 考虑如下结构体定义: ```cpp struct stru { char a; int b; float c; double d; }; ``` 该结构体的实际布局可能是这样的(假设32位系统下): | 字段 | 类型 | 大小(Byte) | 对齐偏移量 | |------|----------|------------|-------------| | `a` | `char` | 1 | 0 | | | padding | 3 | | | `b` | `int` | 4 | 4 (补齐到4B边界) | | `c` | `float` | 4 | 8 | | `d` | `double` | 8 | 12 (补齐至8B边界)| 因此,在这种情况下,即使各个成员加起来只有\(1+4+4+8=17\)字节,但由于编译器自动加入必要的填充空间以满足对齐要求,使得总长度变为24字节。 #### 影响因素总结 影响结构体尺寸的因素主要包括但不限于以下几点: - 数据成员的数量及其顺序; - 各种平台上的不同实现细节; - 编译选项设置,如GCC中的`__attribute__((packed))`可以关闭或减少不必要的填充[^4]; 通过合理安排结构体内的成员次序以及利用属性控制,可以在一定程度上优化内存利用率并减小程序体积。 ```cpp // 示例代码展示如何查看结构体大小 #include <iostream> using namespace std; struct stru{ char a; int b; float c; double d; }; int main(){ cout << "struct: " << sizeof(stru) << " 字节" << endl; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值