系统要求某些原语与内存中的某些点对齐(整数到4的倍数的字节,短到2的倍数的字节等)。当然,这些可以被优化以在填充中浪费最少的空间。我的问题是为什么GCC不自动完成这个任务?更明显的启发式(从最大尺寸需求到最小尺寸需求的顺序变量)是否在某种程度上有所欠缺?一些代码是否依赖于其结构体的物理顺序(这是个好主意吗)?我之所以这么问,是因为GCC在很多方面都是超级优化的,但在这一点上却不是,我想一定有一些相对冷静的解释(我没有注意到)。
9bfwbjaz1#
gcc不会对结构体的元素重新排序,因为这会违反C标准。C996.7.2.1标准的章节www.example.com指出:在一个结构对象中,非位域成员和位域所在的单元的地址按照声明的顺序递增。
ztmd8pv52#
结构经常用作二进制文件格式和网络协议的打包顺序的表示形式。如果那样做的话,这个会坏掉的。此外,不同的编译器会以不同的方式进行优化,将两者的代码链接在一起是不可能的。这根本不可行。
vyswwuz23#
tl;dr GCC不对结构成员重新排序。GCC比我们大多数人更聪明,它能从我们的源代码生成机器代码;然而,如果它在重新排列我们的结构体方面比我们聪明,我会发抖,因为它是数据,例如。可以写入文件。如果在GCC决定重新排列结构成员的另一个系统上读取一个以4个字符开始,然后有一个4字节整数的结构将是无用的。
vyswwuz24#
gcc SVN确实有一个结构重组优化(-fipa-struct-reorg),但它需要整个程序分析,目前还不是很强大。
vq8itlhq5#
C编译器不会自动打包结构体 * 正是因为 * 你提到的对齐问题。不在字边界上的访问(大多数CPU上为32位)在x86上会带来严重的损失,并在RISC架构上导致致命的陷阱。
c7rzv4ha6#
这并不是说这是一个好主意,但您确实可以编写依赖于结构成员顺序的代码。例如,作为一种黑客,人们通常会将指向结构体的指针转换为他们想要访问的某个字段的类型,然后使用指针算法到达那里。对我来说,这是一个相当危险的想法,但我见过它的使用,特别是在C++中,当它在第三方库的类中并且没有公开封装时,强制声明为私有的变量可以公开访问。重新排序成员将完全打破这一点。
k2fxgqgv7#
您可能想尝试最新的gcc Backbone.js 或正在积极开发中的struct-reorg-分支。https://gcc.gnu.org/wiki/cauldron2015?action=AttachFile&do=view&target=Olga+Golovanevsky_+Memory+Layout+Optimizations+of+Structures+and+Objects.pdf
7条答案
按热度按时间9bfwbjaz1#
gcc不会对结构体的元素重新排序,因为这会违反C标准。C996.7.2.1标准的章节www.example.com指出:
在一个结构对象中,非位域成员和位域所在的单元的地址按照声明的顺序递增。
ztmd8pv52#
结构经常用作二进制文件格式和网络协议的打包顺序的表示形式。如果那样做的话,这个会坏掉的。此外,不同的编译器会以不同的方式进行优化,将两者的代码链接在一起是不可能的。这根本不可行。
vyswwuz23#
tl;dr GCC不对结构成员重新排序。
GCC比我们大多数人更聪明,它能从我们的源代码生成机器代码;然而,如果它在重新排列我们的结构体方面比我们聪明,我会发抖,因为它是数据,例如。可以写入文件。如果在GCC决定重新排列结构成员的另一个系统上读取一个以4个字符开始,然后有一个4字节整数的结构将是无用的。
vyswwuz24#
gcc SVN确实有一个结构重组优化(-fipa-struct-reorg),但它需要整个程序分析,目前还不是很强大。
vq8itlhq5#
C编译器不会自动打包结构体 * 正是因为 * 你提到的对齐问题。不在字边界上的访问(大多数CPU上为32位)在x86上会带来严重的损失,并在RISC架构上导致致命的陷阱。
c7rzv4ha6#
这并不是说这是一个好主意,但您确实可以编写依赖于结构成员顺序的代码。例如,作为一种黑客,人们通常会将指向结构体的指针转换为他们想要访问的某个字段的类型,然后使用指针算法到达那里。对我来说,这是一个相当危险的想法,但我见过它的使用,特别是在C++中,当它在第三方库的类中并且没有公开封装时,强制声明为私有的变量可以公开访问。重新排序成员将完全打破这一点。
k2fxgqgv7#
您可能想尝试最新的gcc Backbone.js 或正在积极开发中的struct-reorg-分支。
https://gcc.gnu.org/wiki/cauldron2015?action=AttachFile&do=view&target=Olga+Golovanevsky_+Memory+Layout+Optimizations+of+Structures+and+Objects.pdf