none
VS下,全局变量和局部变量地址都不连续 RRS feed

  • 问题

  • 代码:

    int a;
    int b;
    int c;
    int d;
    
    void main(){
    	printf("0x%x, 0x%x, 0x%x, 0x%x\n", &a, &b, &c, &d);
    
    	int a1, b1, c1, d1;
    	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;
    	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

     

    奇怪,为什么abcd地址不连续呢?全局变量和局部变量地址都不连续!而且全局变量乱序,局部变量48B对齐!

     

    有一个朋友告诉我,这是VS为了防止false sharing而做的优化,但是我又有疑问了,cache line一般是64B,但这里的变量也不是64B对齐啊?

     

    请教大家这是怎么回事,编译器做了些啥动作?为啥做这些动作呢?万分感谢!

    2011年12月14日 7:07

答案

  • C++标准里面没有变量地址连续这一说。变量连自己的地址都不一定有,被优化到寄存器或者参数栈里面也是有的,标准只说只要运行结果一致就可以。你写的程序不应该假定变量地址之间有任何关系。



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    • 已建议为答案 王译 2011年12月15日 0:52
    • 已标记为答案 Helen Zhao 2011年12月20日 2:10
    2011年12月14日 15:28
    版主
  • 你可以关闭程序的优化地址就连续了。

    全局变量不一定连续,但在没有优化的情况下局部变量的地址肯定是连续的,反编译后可以看到他们的地址是在栈中顺序分配的。


    0xBAADF00D
    • 已标记为答案 Helen Zhao 2011年12月20日 2:11
    2011年12月16日 10:46
    版主

全部回复

  • C++标准里面没有变量地址连续这一说。变量连自己的地址都不一定有,被优化到寄存器或者参数栈里面也是有的,标准只说只要运行结果一致就可以。你写的程序不应该假定变量地址之间有任何关系。



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    • 已建议为答案 王译 2011年12月15日 0:52
    • 已标记为答案 Helen Zhao 2011年12月20日 2:10
    2011年12月14日 15:28
    版主
  • C++标准里面没有变量地址连续这一说。变量连自己的地址都不一定有,被优化到寄存器或者参数栈里面也是有的,标准只说只要运行结果一致就可以。你写的程序不应该假定变量地址之间有任何关系。

    嗯,您说的很对,非常感谢您的答案!

    但是局部变量连续排列不是更省空间吗,vs编译器将局部变量间隔开来排列应该是有原因的吧,有没有高手知道这个原因呢?非常感谢!

    vs编译器将全局变量乱序排列也应该是有原因的吧,我编译原理没学好,不知道为什么这么做,特来求教大家。

    2011年12月15日 4:58
  • 连续排列会占去大块的内存空间,分散就可以利用细小的内存间隙,这是操作系统的知识,你可以看看关于内存分配的内容。
    2011年12月15日 5:05
  • 连续排列会占去大块的内存空间,分散就可以利用细小的内存间隙,这是操作系统的知识,你可以看看关于内存分配的内容。

    这个说得好像太玄了吧,就楼主所给的这个小程序来说,用到的几个变量能占多大空间??
    2011年12月16日 9:25
  • 你可以关闭程序的优化地址就连续了。

    全局变量不一定连续,但在没有优化的情况下局部变量的地址肯定是连续的,反编译后可以看到他们的地址是在栈中顺序分配的。


    0xBAADF00D
    • 已标记为答案 Helen Zhao 2011年12月20日 2:11
    2011年12月16日 10:46
    版主