引用有存储位置吗?

时间:2019-07-01 13:24:00

标签: c++ reference language-lawyer memory-layout storage-duration

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

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

struct aStruct{
   int aVariable;
   aClass& aReferencetoaClass;
};

它占用空间还是别名?

2 个答案:

答案 0 :(得分:16)

latest C++20 spec(第9.2.3.3节),至少从C++ 2005 draft spec状态开始:

  

尚不确定引用是否需要存储

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

答案 1 :(得分:10)

大多数编译器(至少对于C ++ 17之前的任何C ++标准)都将有效地实现引用作为指针,除非进行了优化。

尤其是在struct内部,它将占用指针的大小(加上对齐/填充等)。

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

struct S {
    char & a;
};

static_assert(sizeof(S) == sizeof(void *));