参考是否有存储位置?

Tar*_*ing 23 c++ reference memory-layout language-lawyer storage-duration

引用是否具有存储位置,或者仅仅是另一个位置的别名?这是否因C ++版本不同而不同,或者是否与C ++的所有版本都一致?并且,如果引用具有存储位置,那么它是否只允许在类型之类的指针上使用值语义?

像这样使用参考如何工作:

struct aStruct{
   int aVariable;
   aClass& aReferencetoaClass;
};
Run Code Online (Sandbox Code Playgroud)

它会占用空间还是别名?

Pau*_*ans 16

最新的C ++ 20规范(§9.2.3.3)和自至少C ++ 2005规范草案状态:

未确定参考是否需要存储

实际的实施情况视具体情况而定。显然,如果类具有单个成员变量,则该成员变量是需要存储在某处的引用。但是,正如您所说的,编译器还有余地何时仅将引用用作别名。


Aco*_*orn 10

除非经过优化,否则大多数编译器(对于至少C ++ 17或更高的任何C ++标准)都将有效地实现引用作为指针。

特别是在里面struct,它将占用指针的大小(加上对齐/填充等)。

因此,这在大多数环境中都适用:

struct S {
    char & a;
};

static_assert(sizeof(S) == sizeof(void *));
Run Code Online (Sandbox Code Playgroud)

  • @Acorn如果引用有存储,则未指定,因此,如果有地址,则未指定。 (3认同)
  • @Slava:是的,从理论上讲,C ++实现可以做到这一点。在实践中,我不知道任何能优化引用的方法,这些方法可以被证明总是被初始化为引用一个已知位置(结构/类的另一个成员,或始终指向同一静态对象)。因此在实践中,引用基本上是'char * const c;`周围的语法糖。否则,结构布局将取决于有关如何初始化引用的编译时证明。这可能取决于您是否进行优化编译,并且无法链接release + debug对象=很奇怪。 (3认同)
  • “特别是在结构内部”-不一样,它可能引用同一结构的另一个成员,因此它可能只是一个别名。 (2认同)
  • @eerorika确实。我猜想有人可以提出一个极端案例,在这种情况下,可以证明类型具有始终指向已知位置的引用成员,以便可以对其进行优化-但我怀疑编译器是否会为此进行优化它在实际代码中基本上没有用。 (2认同)