C ++编译器如何在参考参数中实际传递文字常量?

时间:2017-05-29 09:38:06

标签: c++ parameter-passing

据我所知(参见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)传递值。但我认为这是一个很好的例子来说明我的疑问。

2 个答案:

答案 0 :(得分:2)

每个编译器都决定如何实现文字(以及相关的引用)。我并不熟悉如何实现gcc,但我猜想可能的实现:

文字值存储在可执行二进制文件的只读部分中,该部分在执行开始时加载到内存中。由于对象在内存中,因此它具有地址。该地址可以分配给指针/引用。

  

我想知道当没有传递实际变量时机制如何工作

对象可以在没有变量的情况下存在。考虑例如动态分配。可以指出/引用这些对象。是否存在变量对引用的工作方式影响不大。

答案 1 :(得分:1)

文字在内存中分配,它是静态内存,但仍然是内存。假设 42 是4字节整数,它将在内存中表示为

->| 00000000 | 00000000 | 00000000 | 00101010 |

C ++正在使用的内存引用(const int&amp; n)指向该内存地址(您可以将内存设想为带有单元格的表)。

由于您使用的是小端系统,实际的内存表示应该是:

->| 00101010 | 00000000 | 00000000 | 00000000 |