C++ vs2010中的可变安排
Code://VS2010C++ vs2010中的可变安排,c++,c,visual-studio-2010,gcc,compiler-construction,C++,C,Visual Studio 2010,Gcc,Compiler Construction,Code://VS2010 int a; int b; int c; int d; int main(){ //output the address of global variables printf("0x%x, 0x%x, 0x%x, 0x%x\n", &a, &b, &c, &d); int a1, b1, c1, d1; //output the address of local variables print
int a;
int b;
int c;
int d;
int main(){
//output the address of global variables
printf("0x%x, 0x%x, 0x%x, 0x%x\n", &a, &b, &c, &d);
int a1, b1, c1, d1;
//output the address of local variables
printf("0x%x, 0x%x, 0x%x, 0x%x\n", &a1, &b1, &c1, &d1);
int a2 = 1;
int b2 = 2; int c2; int d2 = 4;
//output the address of local variables
printf("0x%x, 0x%x, 0x%x, 0x%x\n", &a2, &b2, &c2, &d2);
}
输出:
0x1197a44, 0x1197a3c, 0x1197a40, 0x1197a38
0x15fb00, 0x15faf4, 0x15fae8, 0x15fadc
0x15fad0, 0x15fac4, 0x15fab8, 0x15faac
0x60103c, 0x601034, 0x601038, 0x601030
0x7fff126253a0, 0x7fff126253a4, 0x7fff126253a8, 0x7fff126253ac
0x7fff126253b0, 0x7fff126253b4, 0x7fff126253b8, 0x7fff126253bc
我的问题:
为什么全局变量没有按顺序存储
?上面的输出表示它们出现故障为什么本地变量没有连续存储
?上面的输出表示VS2010在每两个输出之间插入8字节的空间0x1197a44, 0x1197a3c, 0x1197a40, 0x1197a38
0x15fb00, 0x15faf4, 0x15fae8, 0x15fadc
0x15fad0, 0x15fac4, 0x15fab8, 0x15faac
0x60103c, 0x601034, 0x601038, 0x601030
0x7fff126253a0, 0x7fff126253a4, 0x7fff126253a8, 0x7fff126253ac
0x7fff126253b0, 0x7fff126253b4, 0x7fff126253b8, 0x7fff126253bc
在gcc中,全局变量和局部变量的地址是连续的、有序的
因此,我想知道vs2010为我们的代码做了什么以及为什么这样做。它们都不是由规范指定的,编译器可以做它想做的事情
至于局部变量,您可能正在使用
DEBUG
build,并插入填充以检查堆栈完整性。如果发生任何内存溢出,填充将被覆盖,溢出将被发现。您的程序具有未定义的行为,因为格式字符串中指定的类型与传递给printf
的其他参数的类型不匹配
因此,您的代码不能证明变量不是连续存储的。Yeah-请尝试printf(“%p”和&a);虽然他确实应该使用%p,但这不是变量不连续的原因@亚历克西斯·威尔克:你为什么说变量不是连续的?Daneill的代码根本没有证明这一点。它所显示的是,具有未定义行为的程序有时会产生意外的结果。我使用printf(“%p”、&a)进行了尝试。输出是一样的。我想我应该写下变量不需要以连续的方式(一个接一个)分配。尽管变量的大小可能会因为填充而使它看起来不是连续的。对于局部变量,它也可能多次重用同一位置(一旦一个变量的生存期结束,另一个变量可以安全地重用其位置),并且局部变量通常分配在寄存器中(除非像示例中那样取消引用)。我最大胆的猜测是编译器使用了类似于变量名哈希的东西。该散列已排序,但与定义变量的顺序不对应。另外,无论如何,你不应该依赖于这个顺序(除非你写汇编代码…),如果你需要有序的东西,创建一个结构或数组。谢谢Alexis!我知道你的意思,但我想知道VS2010为我们的代码做了什么以及为什么要做这些。哈希可以用来提高速度,而不是从上到下搜索数组。这就是说,他们可以利用一个额外的索引表。。。现在如果不查看代码内部,就很难说出确切的原因。