struct/classes 是否会以某种方式影响内存填充?
Do struct/classes somehow affect memory padding?
以下代码有 2 个问题:
struct Value
{
int value
}
void main()
{
Value v1;
Value v2;
int a;
int b;
return 0;
}
1) 为什么我的函数中变量的内存地址是向下存储的?
v1 -> 0x00007fff5fbff758
v2 -> 0x00007fff5fbff750
但是例如在我的结构中它们存储在另一个方向?
例如如果 Value 有另一个变量 int value_2;
v1.value -> 0x00007fff5fbff750
v2.value_2 -> 0x00007fff5fbff754
2)
为什么 int a 和 int b 在内存中是连续的,为什么 v1 和 v2 在内存中不是连续的。
有没有我不知道的对齐方式?
编辑:
时隔一年再回到这里。
在重新学习了组装的基础知识之后,这现在变得更有意义了。
我给对底层布局等感兴趣的人的建议。学完C++再看asm,真的很有趣。
1) 由编译器决定变量的存储顺序。可能没有特别的原因,尽管在函数中变量以下推顺序存储在堆栈中,因此如果先推送 v1,然后推送 v2,则 v2 是 'below' v1.
是有道理的
相比之下,结构中的顺序必须遵循声明(它在 C 规范中的某处)。原因是结构可能会覆盖数组或其他内存映射区域,您要确保变量在其中具有特定的顺序和对齐方式。
2) 不确定,但编译器可能决定将结构对齐到 8 字节边界以进行优化(您似乎使用 64 位编译器,所以 8 字节是 'natural' 对齐)。
以下代码有 2 个问题:
struct Value
{
int value
}
void main()
{
Value v1;
Value v2;
int a;
int b;
return 0;
}
1) 为什么我的函数中变量的内存地址是向下存储的?
v1 -> 0x00007fff5fbff758
v2 -> 0x00007fff5fbff750
但是例如在我的结构中它们存储在另一个方向? 例如如果 Value 有另一个变量 int value_2;
v1.value -> 0x00007fff5fbff750
v2.value_2 -> 0x00007fff5fbff754
2) 为什么 int a 和 int b 在内存中是连续的,为什么 v1 和 v2 在内存中不是连续的。
有没有我不知道的对齐方式?
编辑:
时隔一年再回到这里。 在重新学习了组装的基础知识之后,这现在变得更有意义了。 我给对底层布局等感兴趣的人的建议。学完C++再看asm,真的很有趣。
1) 由编译器决定变量的存储顺序。可能没有特别的原因,尽管在函数中变量以下推顺序存储在堆栈中,因此如果先推送 v1,然后推送 v2,则 v2 是 'below' v1.
是有道理的相比之下,结构中的顺序必须遵循声明(它在 C 规范中的某处)。原因是结构可能会覆盖数组或其他内存映射区域,您要确保变量在其中具有特定的顺序和对齐方式。
2) 不确定,但编译器可能决定将结构对齐到 8 字节边界以进行优化(您似乎使用 64 位编译器,所以 8 字节是 'natural' 对齐)。