1

我的编译器是 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;

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

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

为什么aand的地址b低于iref栈中的地址?

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

代码3

当代码喜欢

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

当类型irefchar时,为什么地址iref低于i

谁能告诉我为什么,谢谢!

4

2 回答 2

2

你的直觉是对的,iref确实是一个单独的内存位置分配了一个临时的。

内存地址的顺序取决于编译器,显然代码生成是这样对堆栈进行排序的。我不知道为什么 g++ 会这样命令它——您可能必须深入研究 g++ 内部文档甚至源代码。

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

于 2013-08-23T12:26:11.503 回答
0
long i = 2222;
const long& lref = i;

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

const int& iref = i;

这里,类型不匹配,所以iref不能直接引用i. 人们可能期望这会产生错误;但是,该语言有两个漏洞:

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

(也许令人惊讶的)结果是iref指的是一个单独的值,具有不同的地址i

于 2013-08-23T12:49:11.790 回答