GCC优化对结构体大小的影响

3

假设我有一个包含其他结构体的大型结构体,那么使用gcc -os或者任何其他gcc优化开关会改变它在内存中的存储方式吗?也就是说,它会压缩结构体以释放一些额外的空间吗?

谢谢。


3
你试过了吗?我敢打赌你没有。 - BlackBear
3个回答

4
不,如果要改变gcc中结构的本机平台对齐方式,则必须明确使用__attribute__((packed))__attribute__((align X))编译器指令,或其他gcc命令行开关,以明确指示编译器更改数据结构的本机平台对齐方式。
另外,将具有混合数据类型的结构打包,使得所有数据成员在内存中可能没有对齐到正确的字边界,实际上会使访问运行时的数据成员更慢,而不是更快。这是因为编译器在访问数据成员之前必须将结构解压回平台的本机对齐方式。

2
这不是唯一的方法 - 还有命令行开关,例如 -malign = ...,并且您可能会在 -m32-m64 之间获得差异。 - Paul R
我更喜欢使用#pragma pack而不是__attribute__。主要是因为我从来不喜欢属性语法,但也部分原因是支持它的编译器之间的#pragma pack语法相当相似。 - Brian McFarland

3
不会出现这种情况 - 只要您对所有代码模块使用相同的对齐和打包选项,它们就应该可以正确地共同工作,即使使用不同的优化级别编译。

如果你有不同的布局是由不同的-O设置生成的,那么在一个翻译单元中生成的代码可能与在另一个翻译单元中使用结构/类时期望的布局不匹配。这将是一场噩梦,所以你可以看到为什么这不是一个选项,正如之前的帖子指出的那样。 - Cecil Ward

0
事实上,我可以看出通过对结构体进行对齐(通过填充)可能会导致更短的代码(没有跨边界字寻址->更少的加载/存储)。 -Os 优化二进制文件大小(即通常称为代码大小),而不是内存压缩。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接