参考如何与实现中的指针不同?

smw*_*dia 28 c++ pointers language-design

可能重复:
C++中指针变量和引用变量之间的差异

我正在阅读Stanley Lippman撰写的"Inside the C++ Object Model"一书.令我困惑的是对象的"引用"和对象的"指针"之间的区别.我知道引用必须在声明时初始化,而指针可以留待以后初始化.但我想知道它们之间的物理实现差异.

为什么要有"参考"机制; 它不是重叠指针的功能?在什么情况下我们应该使用指针以外的参考?非常感谢.

dir*_*tly 9

可以将引用视为隐式取消引用的常量指针(请注意这一点).一旦参考,总是一个参考.它允许轻松编写代码.当然,除非您引入移动语义和r值引用.该标准没有强制要求如何实现引用,因为它没有强制如何实现指针.大多数情况下,指针与对象的地址同义.


Pra*_*rav 8

大多数引用是使用指针变量实现的,即引用通常占用一个字的内存.但是,优化器可以 - 通常是 - 消除纯粹本地使用的引用.例如:

  struct S { int a, int b[100]; };  
  void do_something(const vector<S>& v)
  {
    for (int i=0; i<v.size(); ++i) {
        int*& p = v[i].b;
          for (int j=0; j<100; ++j) cout <<p[j];
  }
Run Code Online (Sandbox Code Playgroud)

在这种情况下,p不需要存储在存储器中(可能它只存在于寄存器中,也许它会消失在指令中).

  • 这有点误导,因为本地使用的指针也可以被优化器消除. (4认同)

Jer*_*fin 6

尽可能使用引用,并在需要时使用指针.您需要使用指针的原因:

  1. 可能没有对象指向(空指针,没有空引用).
  2. 您可能需要在其生命周期内引用不同的对象.
  3. 您可能需要引用整个对象数组(但std::vector通常更好).

但是,有两种情况下根本没有真正重叠的情况,你根本无法用另一种代替.举一个明显的例子,请考虑以下代码:

template <class T, size_t N>
size_t size(T(&matrix)[N]) {
    return N;
}
Run Code Online (Sandbox Code Playgroud)

这允许您查找数组的大小:

int array1[some_size];
int array2[some_other_size];

size_t n = size(array1);  // retrieves `some_size`
size_t m = size(array2);  // retrieves `some_other_size`
Run Code Online (Sandbox Code Playgroud)

...但是如果你试图传递一个指针,它就不会编译:

int *x = new int[some_size];

size_t n = size(x);    // won't compile
Run Code Online (Sandbox Code Playgroud)

在最好的情况下,当它的一部分要拒绝传递指针时,编写接收指针的代码似乎没有多大意义.