C++中的sizeof()问题

来源:百度知道 编辑:UC知道 时间:2024/06/15 14:07:01
#include<iostream>
using namespace std;
int main()
{
struct{
char i;
char j;
int m;
double d;
}a;
struct{
char x;
int n;
char e;
double f;
}b;
double l;
int q;
char s;
cout<<sizeof(a)<<endl;
cout<<sizeof(b)<<endl;
cout<<sizeof(l)<<endl;
cout<<sizeof(q)<<endl;
cout<<sizeof(s)<<endl;
system("pause");
return 0;
}
两个结构体的size为什么不一样啊 ,我知道怎么对齐但是应该也是一样的吧

你确定你知道怎么对齐么?
a的话,先是2字节放i,j成员,然后m需要按4对齐,所以j成员后要空2字节,然后m是4字节,然后d是8字节,总共16字节

b的话,先是x占1字节,然后n要按4对齐,所以x后空3字节,然后n是4字节,然后e是1字节,再是f要按8对齐,所以e后要空7字节,再是f的8字节,总共24字节

你明显还不知道怎么对齐.易知char,char,int顺序的结构占8字节,char,int,char顺序12字节,再来一个double,两者分别为16与20字节,由于字节数要为最大类型的整数倍,所以后者为24字节.

恩,是编译器优化的结果,就是楼上说的对齐,是为了检索的时候方便,就是使得本身一个字节的按照2个或者4个自己的宽度来存储。
这样的话地址刚好相隔4个地址位,检索的时候只要当前地址+4Xn就行。可以加快运算速度

“成员对齐有一个重要的条件,即每个成员按自己的方式对齐.其对齐的规则是,每个成员按其类型的对齐参数(通常是这个类型的大小)和指定对齐参数(这里默认是8字节)中较小的一个对齐.并且结构的长度必须为所用过的所有对齐参数的整数倍,不够就补空字节。”

“复杂类型(如结构)的默认对齐方式是它最长的成员的对齐方式。”

结构a、b在内存中的布局情况如下:(0表示空字节)
a:i|j|0|0|m |d |(16)
b: x|000|n |e |0000|f | (24)

不知道讲清楚了没。

对齐不是简单的按最大的对齐的。。。

这个问题涉及到对齐~楼上的正解~~~