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)