一个sizeof的问题,想不明白

hellodudu 2009-02-17 04:30:54
题目是这样的:

union a
{
int a_int1;
double a_double;
int a_int2;
};

typedef struct
{
a a1;
char y;
} b;

class c
{
double c_double;
b b1;
a a2;
};



问sizeof(c)的值是多少,我觉得应该是48,可是编译出来是32
我认为是这样的,sizeof(a)应该是取其结构中最大类型所占字节,也就是8。sizeof(b)应该是8+1再填充为8的倍数,也就是16。这两个都没有问题。但是sizeof(c)为什么是8+16+8呢? 为什么不是16+16+8再填充为16的倍数也就是48呢? c中的b1的偏移量不是应该填充为其倍数吗,也就是说c_double应该要占16个字节才对啊! 想不明白了.
...全文
158 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
nullah 2009-02-17
  • 打赏
  • 举报
回复
up
运行B是16看来我理解错了~~
nullah 2009-02-17
  • 打赏
  • 举报
回复
按照内存对齐:
a---->8
b---->12---->是4的倍数 不是8的倍数
c
0-7 double
8-11 补齐
12-23 b
23-31 a

就是32的
operatingtuzi 2009-02-17
  • 打赏
  • 举报
回复
[Quote]
b的对齐要求是8,不是16。对齐要求取决于结构中成员的最大对齐要求,而不取决于结构的大小
[/Quote]
恩 正解。
采用字节对齐的方式,可以减少访问的次数,提高效率
yangch_nhcmo 2009-02-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 tangshuiling 的回复:]
C/C++ codesizeof(c)=8+16+8会有什么问题?
系统的默认对齐数值就是8,没有多余的字节需要填充,自然就是32
加入预编译条件#pragmapack(4)按4字节对齐sizeof(c)=8+12+8
[/Quote]
---------------------
正解
jiweihong 2009-02-17
  • 打赏
  • 举报
回复
union a
{
int a_int1;
double a_double;
int a_int2;
};

typedef struct
{

a a1;
char y;
} b;

class c
{
// char ss;
public:
double c_double;
b b1;
a a2;
};

int main()
{
a wu;
b wu1;
c wu2;

int num = sizeof(wu);
num = sizeof(wu1);
num = sizeof(wu2);

/* wu2.c_double = 55;------------8
wu2.b1.a1.a_double =111;------------8
wu2.b1.y =222;-------------8
wu2.a2.a_double = 66;--------------8*/

}
是这样的。各成员变量存放的起始地址相对于结构的起始地址的偏移量应该是该变量类型所占字节数的整数倍。

c wu2; 对于这个我想应该按每一个变量来说,不能说结构了吧。毕竟在内存中也是一个变量占用一个地址。不会说这个结构占这么多。

如果有错欢迎讨论。
kiffa 2009-02-17
  • 打赏
  • 举报
回复
1,struct K{
char c;
double d;
};

默认对齐的情况下,sizeof(K) = 4 + 8 = 12,而不是8 + 8 = 16,32位gcc下测试。你的sizeof(struct b)也是12,并非16.而最终的sizeof(c) = 28,并非32,均为32位gcc下测试。64位编译器可能会有所区别。

2,如6楼所说:一般而言,编译器的对齐要求取决于 结构中成员的最大对齐要求以及编译器指定对齐字节中的最小值(常见32位编译器默认指定的对齐字节数为8),而不取决于结构的大小。

3,字节对齐的原因以及方式(原则)并非什么特别复杂的事情,没必要神化编译器,没必要认为编译器的对齐考虑“不是常人能理解的”。
tangshuiling 2009-02-17
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 hellodudu 的回复:]
我的意思是这样的
class test
{
char c;
double d;
};

sizeof(test)的值应该是8+8=16吧 因为c虽然只占一个字节,但是要使得d在test中的偏移量为其自身所占字节的倍数,这样cpu的运行效率才会高,所以c占了一个字节,但是被填充了7个字节。

所以在
class c
{
double c_double;
b b1;
a a2;
};
里面 虽然c_double占8个字节,但是要填充8个字节,才能使得b1在c中的偏移量为…
[/Quote]
系统为什么要按楼主的意思去安排对齐方式呢?
假设 b b1;sizeof(b1)所占的字节是1024个字节,难道都得按1024对齐吗?
8个字节的对齐方式是有系统自身的考虑的,并非楼主想当然的那么简单
hellodudu 2009-02-17
  • 打赏
  • 举报
回复
b的对齐要求是8,不是16。对齐要求取决于结构中成员的最大对齐要求,而不取决于结构的大小



是这样的啊? 我以为是根据自身的大小来对齐的。 这样就说得通了
waizqfor 2009-02-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hellodudu 的回复:]
class应该也有吧 我把class c改成struct c结果也是一样的
[/Quote]
晕 我被LZ这题绕进去了
16+16+8不可能出现这个结果啊
8+16+8正确啊 字节对齐就是着样
qzyyh5505 2009-02-17
  • 打赏
  • 举报
回复
sizeof只是说明分配多少字节给他,为什么要填充啊
hellodudu 2009-02-17
  • 打赏
  • 举报
回复
我的意思是这样的
class test
{
char c;
double d;
};

sizeof(test)的值应该是8+8=16吧 因为c虽然只占一个字节,但是要使得d在test中的偏移量为其自身所占字节的倍数,这样cpu的运行效率才会高,所以c占了一个字节,但是被填充了7个字节。

所以在
class c
{
double c_double;
b b1;
a a2;
};
里面 虽然c_double占8个字节,但是要填充8个字节,才能使得b1在c中的偏移量为其自身大小的整数倍,也就是16.
nineforever 2009-02-17
  • 打赏
  • 举报
回复
[Quote=引用楼主 hellodudu 的帖子:]
题目是这样的:

C/C++ code
union a
{
int a_int1;
double a_double;
int a_int2;
};

typedef struct
{
a a1;
char y;
} b;

class c
{
double c_double;
b b1;
a a2;
};





问sizeof(c)的值是多少,我觉得应该是48,可是编译出来是32
我认为是这样的,sizeof(a)应该是取其结构中最大类型所占字节,也就是8。sizeof(b)应该是8+1再填充为8的倍数,也就是16。…
[/Quote]

b的对齐要求是8,不是16。对齐要求取决于结构中成员的最大对齐要求,而不取决于结构的大小
tangshuiling 2009-02-17
  • 打赏
  • 举报
回复

sizeof(c)=8+16+8 会有什么问题?
系统的默认对齐数值就是8,没有多余的字节需要填充,自然就是32
加入预编译条件#pragma pack(4)按4字节对齐
sizeof(c)=8+12+8
叶落寒山 2009-02-17
  • 打赏
  • 举报
回复
[Quote=引用楼主 hellodudu 的帖子:]
题目是这样的:


为什么不是16+16+8再填充为16的倍数也就是48呢? c中的b1的偏移量不是应该填充为其倍数吗,也就是说c_double应该要占16个字节才对啊!
[/Quote]
你这里为什么要说double 是16字节呢,就应该是8字节呀。没明白你说的意思。
叶落寒山 2009-02-17
  • 打赏
  • 举报
回复
对呀,sizeof(a)是 8.因为double 8字节。
sizeof(b)应该是8+1再填充为8的倍数,也就是16。
以上都对呀。
sizeof(c)应该是 8+ 16 + 8再填充为8的倍数.也就是32呀。没有错呀。lz为什么说是48呢

至于一楼说的不正确。class也是要对齐的。看如下的代码

union a
{
int a_int1;
double a_double;
int a_int2;
};

typedef struct
{
a a1;
char y;
} b;

class c
{
// char ss;
double c_double;
b b1;
a a2;
};

int main()
{
a wu;
b wu1;
c wu2;

cout << sizeof(wu)<<endl;
cout << sizeof(wu1)<<endl;
cout << sizeof(wu2)<<endl;

system("pause");
}

类c中加入一个字符变量 sizeof(c)应该是1+ 8+ 16 + 8 再填充为8的倍数.也就是40
hellodudu 2009-02-17
  • 打赏
  • 举报
回复
class应该也有吧 我把class c改成struct c结果也是一样的
waizqfor 2009-02-17
  • 打赏
  • 举报
回复
[Quote=引用楼主 hellodudu 的帖子:]
题目是这样的:

C/C++ code
union a
{
int a_int1;
double a_double;
int a_int2;
};

typedef struct
{
a a1;
char y;
} b;

class c
{
double c_double;
b b1;
a a2;
};





问sizeof(c)的值是多少,我觉得应该是48,可是编译出来是32
我认为是这样的,sizeof(a)应该是取其结构中最大类型所占字节,也就是8。sizeof(b)应该是8+1再填充为8的倍数,也就是16。…
[/Quote]
只有struct有字节对齐 class中是没有这个说法的 所以计算的结果是没有错的

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧