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

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

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

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

为什么ab在栈中的地址低于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

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

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

最佳答案

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

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

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

关于c++ - 为什么在 g++4.7.3 中当 const 引用释放到不同类型时内存分配是这样的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18402691/

相关文章:

python - Boost.Python 返回引用现有 c++ 对象的 python 对象

c++ - 错误,无法在构造函数主体中构造 lambda 的拷贝

c++ - 在qml中动态添加图片对象

在 std::string 上使用 malloc/realloc/free 时出现 C++ 内存错误

c++ - 如何将值存储在内存中的特定位置?

c++ - 具有平凡项(零乘积项)的 g++ 优化算术表达式

c++ - 什么时候通过引用传递 C++ 中的重载运算符?

c++ - 通过网络直接从另一台计算机的内存中读取文件

ios - 增加 iOS 应用程序的内存分配

c++ - C++结构中的运行时大小的数组