当const引用在g ++ 4.7.3中释放到不同类型时,为什么这样的内存分配

时间:2013-08-23 12:19:35

标签: 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);

结果是

i=0xbfd78760 lref=0xbfd78760 iref=0xbfd78764

为什么iref的地址高于i

我认为它可能是这样的: 当const int&引用long时,就像

一样
int temp = i
const int& iref = temp;

=============================================== ===========

CODE2

然而当代码如

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=0xbfade768 lref=0xbfade768 iref=0xbfade774 a=0xbfade76c b=0xbfade770

为什么ab的地址低于堆叠中的iref

=============================================== ===========

CODE3

当代码如

long i = 2222;
const long& lref = i;
const int& iref = i;
printf("i=%p lref=%p iref=%p \n", &i , &lref, &iref);

结果是

i=0xbfbe3f84 lref=0xbfbe3f84 iref=0xbfbe3f83

如果iref的类型为char,为什么iref的地址低于i

有人可以告诉我为什么,谢谢你!

2 个答案:

答案 0 :(得分:2)

你的直觉是正确的,iref确实是一个临时的单独记忆位置。

内存地址的顺序取决于编译器,显然代码生成就像这样对堆栈进行了排序。为什么g ++命令这样我不知道 - 你可能需要深入研究g ++内部文档甚至源代码。

但请记住,在大多数系统上,如果堆栈上的地址较低,则意味着堆栈中的值更高,因为堆栈通常会向下增长。

答案 1 :(得分:0)

long i = 2222;
const long& lref = i;

此处,引用类型与对象类型匹配,因此lref可以是对i的引用。因此,您会看到两者的地址相同。

const int& iref = i;

此处,类型不匹配,因此iref无法直接引用i。人们可能会认为这会给出错误;但是,该语言存在两个漏洞:

  • i可以转换为int类型的临时用户;和
  • 常量引用可以引用临时(延长临时的生命周期以匹配引用的生命周期)。

(可能令人惊讶的)结果是iref引用了一个单独的值,其地址与i不同。