c++中结构体、联合、内存对齐

本文详细解析了C/C++中结构体和联合体的内存对齐原理及计算方法,通过具体实例展示了不同数据类型在结构体中的布局方式,以及联合体如何根据最大成员来确定内存大小。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

struct { 

    short a;

    char b; 
    float c; 
}cs; 

sizeof(cs)=8
首先一个第一个变量在0偏移处。短整型占两个字节,现在就到了2偏移处,一个char占一个字节,2是1的倍数,直接加在后面,现在是3偏移处,而float是4个字节,4不是3的倍数,需要再开辟一个字节,到4偏移处,然后加上4,所以结构体大小为8个字节,最后还要考虑,结构体总大小是不是所有变量的中最大对齐数的倍数,这个就是,就不用加了。如果不是的话,需要加到它的倍数。

 

union联合体其大小取决于所有成员中,占用空间最大的一个成员的大小。例:

union{ 

    short a[10];

    char b; 
    float c; 
}cs; 

sizeof(cs)=20

 

 

int=long=指针=4

char=1        short=2

double=8

### C++结构体内存对齐规则 在C++中,为了提高CPU访问速度并优化性能,编译器会对结构体中的成员变量按照一定的规则进行内存对齐处理。具体来说: #### 对齐原则 - **基本单位**:每个数据类型的自然对齐值通常是其自身的大小。例如,`char` 的对齐值为1字节,`int` 通常为4字节,而 `double` 则可能为8字节。 - **最大对齐值**:整个结构体的最大对齐值等于其中具有最大对齐需求的数据类型。 #### 填充机制 为了让各成员能够按上述原则存储,编译器会在必要时向相邻两个成员间插入一定数量的填充字节(padding),使得下一个成员的位置满足其对应的对齐要求[^3]。 #### 计算过程展示 考虑如下定义: ```cpp typedef struct A { char c; int i; }; ``` 这里 `c` 占用1个字节,之后由于 `int` 需要四字节边界对齐,则紧跟在其后的三个位置被作为填充位;接着放置 `i` 所需四个连续空间。因此最终该结构占用至少8个字节的空间[^2]。 同样的逻辑适用于更复杂的例子如: ```cpp typedef struct C { char c; // 1 byte, padding to next multiple of 4 (total=4) int i; // 4 bytes double d; // 8 bytes, requires alignment on an 8-byte boundary so add another 4 bytes as padding before this member. char c1; // 1 byte, pad with additional 7 bytes at the end because 'd' has largest alignment requirement which is 8-bytes. }; // Total size becomes 24 bytes due to these alignments and paddings added by compiler automatically. ``` 通过以上分析可以看出,即使实际有效载荷只有少量几个字节,但由于内部成员排列顺序以及各自所需的特殊对齐条件影响下,整体所占的实际内存量往往会超出预期。 对于给定的具体实例,可以通过编写测试代码来验证各个结构体的确切尺寸及其布局情况。下面是一个简单示例用于说明这一点: ```cpp #include <iostream> using namespace std; // 定义一些不同的结构体 typedef struct A { char c; int i; } StructA; typedef struct B { char c; int i; double d; } StructB; typedef struct C { char c; int i; double d; char c1; } StructC; int main(void) { cout << "struct A size = " << sizeof(StructA) << endl; cout << "struct B size = " << sizeof(StructB) << endl; cout << "struct C size = " << sizeof(StructC) << endl; return 0; } ``` 此程序将输出每种结构体经过适当调整后的总长度,从而帮助理解不同情况下编译器是如何应用内存对齐策略的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值