根据现有的各种资料,C/C++中联合体类型在内存中的大小默认以最长的为准,并以长度最长的类型对齐。
按照上述原则
union A{
int a[5];
char b;
double c;
};
在内存中所占字节数应为sizeof(int)*5 并使其以sizeof(double)对齐,在32位或者64位系统平台上,sizeof(A)的值应为24.
不过程序:
#include<iostream>
using namespace std;
union A{
int a[5];
char b;
double c;
};
int main(void){
cout << "sizeof(double) is " << sizeof(double) << endl;
cout << sizeof(A) << endl;
return 0;
}
的执行结果却为:
$ g++ tst_sizeof.cpp -o tst_sizeof
$ ./tst_sizeof
sizeof(double) is 8
20不知道大家谁能给解释一下?
在gcc 9.3.0 的测试中, 执行结果和上述分析一致。
test$ ./test
sizeof(double) is 8
24
结构体的sizeof值计算方式和联合体类型相同。内存的对齐是为了提高内存的访问效率。如果有结构体和联合体类型嵌套的情况,应该将被嵌套的类型展开选择最大的基本类型。