含有double成员的结构体对齐的问题

kiffa 2009-02-18 07:56:40
1,代码:
struct K{
double d;
char c;
};

int main()
{
cout << sizeof(K) << endl;
}


2,输出:我的机器上测试结果为12,环境:32位 linux + gcc 3.22(老版本了),编译器默认对齐为8字节,即#pragma pack(8).

3,问题:我以前一直以为这种情况下应该是 8 + 1 + 7 = 16 字节,而且这几天看了几个相关的帖子,论坛上大部分人也都是这种看法:double 占8个字节,因此结构体应该以8字节作为有效对齐位,因此 K 应该为16字节。

但是实验结果是12字节,有说法认为double类型只需要保证4字节对齐即可,不需要8字节。对32位机器来说,这种说法还是有其合理性的。

我希望大家在自己的编译器上测试一下,看看sizeof(K)的结果是多少。
...全文
325 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
sc_valentine21 2009-02-19
  • 打赏
  • 举报
回复
编译器相关吧,知道如何出来的就可以了
pengzhixi 2009-02-19
  • 打赏
  • 举报
回复
关于边界对齐的问题是操作系统的问题.使用内存的时候提高效率
pengzhixi 2009-02-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ljmscsq 的回复:]
我机器上就16,可能编译器不同的关系。
一般情况大小应该是结构中占字节数最大的那个变量的倍数。
double是8,所以16应该没错。
[/Quote]
这个不是编译器的问题是操作系统的问题
yangch_nhcmo 2009-02-19
  • 打赏
  • 举报
回复
Linux GCC 4.3.2 编译时加-malign-double选项 ==>16 //double 按8对齐
编译时不加-malign-double ==>12 //double 按4对齐
小魔菇 2009-02-19
  • 打赏
  • 举报
回复
12
nuoshueihe 2009-02-19
  • 打赏
  • 举报
回复
在windows下的结构体对齐是 16,确实没错
但是在Linux下的结构体对齐默认基本单位是4,doublle只是占2个基本单位,char占一个基本单位,所以说是12,这是我们去年的测试题
nineforever 2009-02-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 kiffa 的回复:]
既然和编译器有关,那如果面试或者笔试的时候遇到对齐相关的题目怎么办,这种题目似乎很容易考到,而且似乎企业都是有其标准答案的,并非那种“和编译器相关”的答案。

哪位兄弟用vc8或者版本比较高的G++测试一下。如果都是16字节,我就认了。

另外无论哪种编译器,只要在同一种机器体系上,那么它们采用对齐策略,其最终的目的应该一样吧,就是尽量避免跨边界访问,避免由此造成的额外内存操作,因此按理说各编译器对齐…
[/Quote]

你可以先问问考官目标平台是什么。Windows就用VC那套,Linux就用GCC那套
a020490 2009-02-19
  • 打赏
  • 举报
回复
16
ForestDB 2009-02-19
  • 打赏
  • 举报
回复
嗯,gcc 3.2.2也可以的,加那个选项。
ForestDB 2009-02-19
  • 打赏
  • 举报
回复
帮LZ试论下,gcc 4.0.0,可以打出16,编译时加-malign-double选项。
然后就这个机会又查了下man page,发现跟上面选项,同时也和-fpack-struct选项有一定的关系。
waizqfor 2009-02-19
  • 打赏
  • 举报
回复
[Quote=引用楼主 kiffa 的帖子:]
1,代码:

C/C++ codestruct K{
double d;
char c;
};

int main()
{
cout << sizeof(K) << endl;
}



2,输出:我的机器上测试结果为12,环境:32位 linux + gcc 3.22(老版本了),编译器默认对齐为8字节,即#pragma pack(8).

3,问题:我以前一直以为这种情况下应该是 8 + 1 + 7 = 16 字节,而且这几天看了几个相关的帖子,论坛上大部分人也都是这种看法:double 占8个字节,因此结构体应该以…
[/Quote]
我机器上也是16 字节对齐 double的是8个字节 然后对齐完就是8+8=16
我记得所说的double一直是8个字节的啊 拿很多编译器试了都是
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 ForestDB 的回复:]
我让它打出9了。--!!
[/Quote]
可以加指令,不按字节对齐规则存储的。
我的对齐下,也是16。
ForestDB 2009-02-19
  • 打赏
  • 举报
回复
我让它打出9了。--!!
pinna_angel 2009-02-19
  • 打赏
  • 举报
回复
我的机器是 16.
fibbery 2009-02-18
  • 打赏
  • 举报
回复
嗯,编译器相关、系统相关。
kiffa 2009-02-18
  • 打赏
  • 举报
回复
既然和编译器有关,那如果面试或者笔试的时候遇到对齐相关的题目怎么办,这种题目似乎很容易考到,而且似乎企业都是有其标准答案的,并非那种“和编译器相关”的答案。

哪位兄弟用vc8或者版本比较高的G++测试一下。如果都是16字节,我就认了。

另外无论哪种编译器,只要在同一种机器体系上,那么它们采用对齐策略,其最终的目的应该一样吧,就是尽量避免跨边界访问,避免由此造成的额外内存操作,因此按理说各编译器对齐的原则应该大同小异。
nineforever 2009-02-18
  • 打赏
  • 举报
回复
不同编译器的对齐规则完全不同
nineforever 2009-02-18
  • 打赏
  • 举报
回复
不同的编译器的对齐规则完全不同
zqz981 2009-02-18
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 tangshuiling 的回复:]
16
32位,windows xp+vs2005
[/Quote]
同上! 估计于编译器有关
tangshuiling 2009-02-18
  • 打赏
  • 举报
回复
16
32位,windows xp+vs2005
加载更多回复(3)

64,646

社区成员

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

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