C++ 当const引用释放到g+中的另一个类型时,为什么内存分配是这样的+;4.7.3
我的编译器是g++4.7.3C++ 当const引用释放到g+中的另一个类型时,为什么内存分配是这样的+;4.7.3,c++,memory,g++,C++,Memory,G++,我的编译器是g++4.7.3 long i = 2222; const long& lref = i; const int& iref = i; printf("i=%p lref=%p iref=%p \n", &i , &lref, &iref); long i = 2222; const long& lref = i; const int& iref = i; printf("i=%p lref=%p iref=%p \n", &a
long i = 2222;
const long& lref = i;
const int& iref = i;
printf("i=%p lref=%p iref=%p \n", &i , &lref, &iref);
long i = 2222;
const long& lref = i;
const int& iref = i;
printf("i=%p lref=%p iref=%p \n", &i , &lref, &iref);
结果是
i=0xbfd78760 lref=0xbfd78760 iref=0xbfd78764
i=0xbfade768 lref=0xbfade768 iref=0xbfade774 a=0xbfade76c b=0xbfade770
i=0xbfbe3f84 lref=0xbfbe3f84 iref=0xbfbe3f83
为什么iref
的地址高于i
我想可能是这样的:
当const int&
引用long
时
int temp = i
const int& iref = temp;
==========================================================
代码2
但是当代码像
long i = 2222;
const long& lref = i;
const int& iref = i;
int a = 10;
int b = 10;
printf("i=%p lref=%p iref=%p a=%p b=%p\n", &i , &lref, &iref, &a, &b);
结果是
i=0xbfd78760 lref=0xbfd78760 iref=0xbfd78764
i=0xbfade768 lref=0xbfade768 iref=0xbfade774 a=0xbfade76c b=0xbfade770
i=0xbfbe3f84 lref=0xbfbe3f84 iref=0xbfbe3f83
为什么堆栈中a
和b
的地址低于iref
==========================================================
代码3
当代码像
long i = 2222;
const long& lref = i;
const int& iref = i;
int a = 10;
int b = 10;
printf("i=%p lref=%p iref=%p a=%p b=%p\n", &i , &lref, &iref, &a, &b);
结果是
i=0xbfd78760 lref=0xbfd78760 iref=0xbfd78764
i=0xbfade768 lref=0xbfade768 iref=0xbfade774 a=0xbfade76c b=0xbfade770
i=0xbfbe3f84 lref=0xbfbe3f84 iref=0xbfbe3f83
当iref
的类型为char
时,为什么iref
的地址低于i
谁能告诉我为什么,谢谢 你的直觉是对的,
iref
确实是一个单独的内存位置,分配了一个临时的
内存地址的顺序由编译器决定,显然代码生成是这样对堆栈进行排序的。我不知道为什么g++会这样订购—您可能需要深入研究g++内部文档甚至源代码
但是请记住,在大多数系统上,如果堆栈上的地址较低,则表示堆栈上的值较高,因为堆栈通常向下增长
long i = 2222;
const long& lref = i;
这里,引用类型与对象类型匹配,因此lref
可以是对i
的引用。因此,您可以看到这两个地址相同
const int& iref = i;
这里的类型不匹配,因此iref
不能直接引用i
。人们可能会认为这是一个错误;但是,该语言存在两个漏洞:
可以转换为i
类型的临时文件;及int
- 常量引用可以引用临时引用(延长临时引用的生存期以匹配引用的生存期)
(可能令人惊讶的)结果是,
iref
引用了一个单独的值,与i
不同的地址这些变量在哪个地址有什么关系?OP是否在编写低级和/或嵌入式代码可能有关。然而,这绝对不是这样做的。理解记忆allocating@CLS这里没有太多重要的事情需要了解。在这里,您还需要了解其他一些关于语言语义的内容。AFAIK编译器不需要按照定义的顺序在堆栈中“分配”局部变量。甚至根本不需要分配它们:它们可以直接放入寄存器,完全优化,等等。因此,对我来说,依赖特定的堆栈内存布局似乎不安全,而且浪费时间。(注意:如果我的直觉是正确的,我想在你的最后一段代码中,const int&iref=I;
相当于const char&iref=I;
)??接下来的两个代码不太符合我的直觉??这就是我想知道的一个可能的线索是填充:可能是g++通过对元素重新排序来最大化堆栈的使用,从而最小化填充。是的,它可能会释放给编译器。谢谢!