[英]Do static members of a class occupy memory if no object of that class is created?
[英]Do class/struct members always get created in memory in the order they were declared?
这是Rob Walker 在这里回答的问题 。
假设我声明一个类/结构,如下所示:
struct
{
char A;
int B;
char C;
int D;
};
是否可以安全地假设这些成员将在内存中以完全相同的顺序声明,或者这是否依赖于编译器? 我问,因为我一直认为编译器可以随心所欲地做任何事情。
这导致了我的下一个问题。 如果上面的例子导致内存对齐问题,为什么编译器不能只是隐式地将它变成这样的东西:
struct
{
char A;
char C;
int B;
int D;
};
(我主要是询问C ++,但我也有兴趣听到C答案)
C99§6.7.2.1第13条规定:
在结构对象中,非位字段成员和位字段所在的单元具有按声明顺序增加的地址。
并继续谈论填充和地址。 C89等效部分是§6.5.2.1。
C ++有点复杂。 在1998年和2003年的标准中,有第9.2条第12款(C ++ 11第15条):
声明没有插入访问说明符的(非联合)类的非静态数据成员,以便后面的成员在类对象中具有更高的地址。 由访问说明符分隔的非静态数据成员的分配顺序未指定(11.1)。 实施对齐要求可能导致两个相邻成员不能立即分配; 因此,可能需要空间来管理虚拟功能(10.3)和虚拟基类(10.1)。
数据成员按声明的顺序排列。 编译器可以自由地散布填充以安排它喜欢的内存对齐(并且你会发现很多编译器都有一个对齐规范选项 - 如果混合由不同程序编译的位,则很有用。)。
另请参见为什么GCC不优化结构? 。
对于C ++来说,这个答案似乎有点过时了。 你每天都学到东西。 谢谢aib,Nemanja。
基本上,只有具有标准布局的类才能指望它。 严格来说,标准布局是一个C ++ 0x的东西,但它实际上只是标准化现有的做法/
我不能说C ++,但在C中,顺序保证与结构中声明的内存顺序相同。
除了用于对齐的填充之外,C或C ++的任何编译器(我都知道)不允许进行结构优化。 我不能代表C ++类,因为它们可能完全是另一个野兽。
考虑您的程序在Windows上与系统/库代码连接,但您想使用GCC。 您必须验证GCC使用相同的布局优化算法,以便在将它们发送到MS编译的代码之前正确打包所有结构。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.