以下代码有两个问题:
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,这真的很有趣。
答案 0 :(得分:0)
1)编译器确定变量的存储顺序。可能没有特别的原因,尽管在函数变量中按下推顺序存储在堆栈中,所以如果首先推送v1,那么v2有意义v2是'低于'v1。
相反,结构中的顺序必须遵循声明(它在C规范中的某个位置)。原因是结构可能覆盖数组或其他内存映射区域,您希望确保变量按特定顺序和对齐方式。
2)不确定,但编译器可能决定将结构与8字节边界对齐以进行优化(您似乎使用64位编译器,因此8字节是'自然'对齐)。