【问题标题】:variable arrangement in vs2010vs2010中的可变排列
【发布时间】:2011-12-15 05:28:53
【问题描述】:

代码://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
    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

我的问题:

  1. Why are the global variables not stored in order?上面的输出表示它们是乱序的。

  2. Why are the local varialbes not stored continuously?上面的输出代表VS2010每两个之间插入8字节的空间。

有人可以帮助我吗?非常感谢!

---------------------------补充-------- ----------------------------------

代码:\gcc 版本 4.6.1 (Ubuntu/Linaro 4.6.1-9ubuntu3)

int a;
int b;
int c;
int d;

void main(){
        //output the address of global variables
    printf("%p, %p, %p, %p\n", &a, &b, &c, &d);

    int a1, b1, c1, d1;
        //output the address of local variables
    printf("%p, %p, %p, %p\n", &a1, &b1, &c1, &d1);

    int a2 = 1;
    int b2 = 2; int c2; int d2 = 4;
        //output the address of local variables
    printf("%p, %p, %p, %p\n", &a2, &b2, &c2, &d2);
}

输出:

0x60103c, 0x601034, 0x601038, 0x601030
0x7fff126253a0, 0x7fff126253a4, 0x7fff126253a8, 0x7fff126253ac
0x7fff126253b0, 0x7fff126253b4, 0x7fff126253b8, 0x7fff126253bc

在gcc中,全局变量和局部变量的地址是连续有序的。

所以我想知道 vs2010 对我们的代码做了什么以及为什么这样做。

【问题讨论】:

    标签: c++ c visual-studio-2010 gcc compiler-construction


    【解决方案1】:

    它们都不是规范指定的,编译器可以做它想做的。

    至于局部变量,您可能正在使用DEBUG 构建,并插入填充以检查堆栈完整性。如果发生任何内存溢出,填充将被覆盖并且溢出将被发现。

    【讨论】:

    • 我最疯狂的猜测是编译器使用了变量名的哈希值。该哈希已排序,但与您定义变量的顺序不对应。另外,无论如何,您都不应该依赖该顺序(除非您编写汇编代码......)如果您需要按顺序排列,请创建一个结构或数组。
    • 谢谢亚历克西斯!我知道你的意思,但我想知道 VS2010 为我们的代码做这些以及为什么这样做。
    • 哈希将用于更快的速度,而不是从上到下搜索数组。话虽如此,他们可以利用额外的索引表......现在不看代码,很难说出确切的原因。
    【解决方案2】:

    您的程序具有未定义的行为,因为格式字符串中指定的类型与传递给printf 的其他参数的类型不匹配。

    因此,您的代码并未证明变量不是连续存储的。

    【讨论】:

    • 是的 - 试试 printf("%p", &a);
    • 虽然他确实应该使用%p,但这不是变量不连续的原因!?
    • @AlexisWilke:为什么说变量不连续? Daneill 的代码根本没有证明这一点。它所表明的只是行为未定义的程序有时会产生意想不到的结果。
    • 我用 printf("%p", &a) 试试看。输出是一样的。
    • 我想我应该写下变量不需要以连续的方式分配(一个接一个)。虽然变量的大小可以使它看起来因为填充而不是连续的.对于局部变量,它也可以多次重用同一个位置(一旦变量生命周期结束,另一个可以安全地重用它的位置)并且局部变量通常在寄存器中分配(除非您像示例中那样取消引用它们。)跨度>
    猜你喜欢
    • 2012-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多