可能的复制品:
为什么海湾合作委员会不优化结构?
为什么 C + + 不使结构更紧凑
考虑一下32位 x86计算机上的以下示例:
由于对齐约束,下面的结构
struct s1 {
char a;
int b;
char c;
char d;
char e;
}
可以更有效地表示内存(12比8字节) ,如果成员按照
struct s2 {
int b;
char a;
char c;
char d;
char e;
}
我知道 C/C + + 编译器不允许这样做。我的问题是为什么语言是这样设计的。毕竟,我们可能最终会浪费大量的内存,而像 struct_ref->b
这样的引用不会关心这种差异。
编辑 : 感谢你们所有人给出的非常有用的答案。您很好地解释了为什么由于语言的设计方式,重新排列不起作用。然而,这让我想到: 如果重新安排是语言的一部分,这些争论还会继续吗?假设有一些特定的重排规则,我们至少需要这个规则
我逐一解释你的论点:
低级数据映射,“ element of less 驚” : 只要自己用紧凑的风格编写结构(就像@Perry 的答案) ,什么都没有改变(需求1)。如果出于某种奇怪的原因,您希望内部填充出现在那里,您可以使用虚拟变量手动插入它,并且/或者可以有关键字/指令。
编译器差异 : 需求3消除了这个问题。事实上,从@David Heffernan 的评论来看,我们今天似乎有这个问题,因为不同的编译器垫不同?
优化 : 重新排序的全部意义在于(内存)优化。我看到了很多潜力。我们可能无法一起去除所有的填充,但我不认为重新排序可以以任何方式限制优化。
类型转换 : 在我看来,这是最大的问题。不过,应该有办法解决这个问题。由于这些规则在语言中是固定的,编译器能够找出成员是如何重新排序的,并作出相应的反应。如上所述,在需要完全控制的情况下,总是可以防止重新排序。另外,需求2确保类型安全的代码永远不会中断。
我之所以认为这样的规则是有意义的,是因为我发现按照结构成员的内容而不是按照它们的类型来分组更自然。而且,当我有很多内部结构时,编译器比我更容易选择最佳排序方式。最佳布局甚至可能是我无法以类型安全的方式表示的布局。另一方面,它似乎使语言更加复杂,这当然是一个缺点。
请注意,我并不是说要改变语言——只有当它可以(/应该)被设计成不同的语言时才会这样。
我知道我的问题是假设性的,但我认为这个讨论提供了对机器和语言设计较低层次的更深入的见解。
我是新来的,所以我不知道是否应该提出一个新的问题。如果是这样的话,请告诉我。