据我所知(参见this post),C ++引用实现基于指针。但是,我想知道当没有传递实际变量时机制如何工作,但是文字常量。让我用一个例子来说明我的意思:
#include <iostream>
void f(const int& n)
{
std::cout << n << std::endl;
}
int main()
{
f(42);
}
我传递给f()
函数的是文字42
。调用者没有使用任何实际变量。
在这种情况下,可能会使用“阴影”即时变量和关联指针?如果我错了,任何人都可以确认(或解释实际机制)?
作为参考,如果答案是编译器相关的,我们通常使用gcc 4.4(在CentOS 6.x中)和gcc 4.9(在Debian 8中)。
注意:我已经知道通过引用传递一个常量整数不是一个好主意。我的意思是,上面f()
函数的更好方法是使用void f(int n)
传递值。但我认为这是一个很好的例子来说明我的疑问。
答案 0 :(得分:2)
每个编译器都决定如何实现文字(以及相关的引用)。我并不熟悉如何实现gcc,但我猜想可能的实现:
文字值存储在可执行二进制文件的只读部分中,该部分在执行开始时加载到内存中。由于对象在内存中,因此它具有地址。该地址可以分配给指针/引用。
我想知道当没有传递实际变量时机制如何工作
对象可以在没有变量的情况下存在。考虑例如动态分配。可以指出/引用这些对象。是否存在变量对引用的工作方式影响不大。
答案 1 :(得分:1)
文字在内存中分配,它是静态内存,但仍然是内存。假设 42 是4字节整数,它将在内存中表示为
->| 00000000 | 00000000 | 00000000 | 00101010 |
C ++正在使用的内存引用(const int&amp; n)指向该内存地址(您可以将内存设想为带有单元格的表)。
由于您使用的是小端系统,实际的内存表示应该是:
->| 00101010 | 00000000 | 00000000 | 00000000 |