参考占用的空间

引用不是对象,与对象不同,它不能保证占用一些连续的内存字节。该标准没有说明引用是否需要任何存储。该语言的许多功能共同导致无法移植检查引用可能占用的任何存储:

  • 如果将 sizeof 应用于引用,则返回引用类型的大小,从而不提供有关引用是否占用任何存储的信息。
  • 引用数组是非法的,因此无法检查数组假设引用的两个连续元素的地址,以确定引用的大小。
  • 如果采用引用的地址,则结果是引用的地址,因此我们无法获得指向引用本身的指针。
  • 如果类具有引用成员,则尝试使用 offsetof 提取该成员的地址会产生未定义的行为,因为这样的类不是标准布局类。
  • 如果类具有引用成员,则该类不再是标准布局,因此尝试访问用于存储引用的任何数据会导致未定义或未指定的行为。

实际上,在某些情况下,参考变量可以与指针变量类似地实现,因此占据与指针相同的存储量,而在其他情况下,参考可以根本不占用空间,因为它可以被优化掉。例如,在:

void f() {
    int x;
    int& r = x;
    // do something with r
}

编译器可以自由地将 r 视为 x 的别名,并用 x 替换函数 f 的其余部分中的所有 r,而不是分配任何存储来保存 r