引用是否有存储位置?
Does a reference have a storage location?
引用是否有存储位置,或者它只是另一个位置的别名?这是否因 C++ 版本而异,还是与所有 C++ 版本一致?如果一个引用有一个存储位置,那么它是否只允许像类型这样的指针上的值语义?
当您这样使用参考时,参考如何工作:
struct aStruct{
int aVariable;
aClass& aReferencetoaClass;
};
占用space还是别名?
latest C++20 spec(§ 9.2.3.3) and at least since the C++ 2005 draft spec状态:
It is unspecified whether or not a reference requires storage
实际实施是在 case-by-case 的基础上进行的。显然,如果 class 有一个成员变量,它是一个需要存储在某处的引用。但是正如您所说,编译器在何时仅将引用用作别名时有余地。
大多数编译器,对于任何至少达到 C++17 的 C++ 标准,都会有效地将引用实现为指针,除非进行优化。
特别是,在struct
内部,它将占用指针的大小(加上alignment/padding等)。
因此,这适用于大多数环境:
struct S {
char & a;
};
static_assert(sizeof(S) == sizeof(void *));
引用是否有存储位置,或者它只是另一个位置的别名?这是否因 C++ 版本而异,还是与所有 C++ 版本一致?如果一个引用有一个存储位置,那么它是否只允许像类型这样的指针上的值语义?
当您这样使用参考时,参考如何工作:
struct aStruct{
int aVariable;
aClass& aReferencetoaClass;
};
占用space还是别名?
latest C++20 spec(§ 9.2.3.3) and at least since the C++ 2005 draft spec状态:
It is unspecified whether or not a reference requires storage
实际实施是在 case-by-case 的基础上进行的。显然,如果 class 有一个成员变量,它是一个需要存储在某处的引用。但是正如您所说,编译器在何时仅将引用用作别名时有余地。
大多数编译器,对于任何至少达到 C++17 的 C++ 标准,都会有效地将引用实现为指针,除非进行优化。
特别是,在struct
内部,它将占用指针的大小(加上alignment/padding等)。
因此,这适用于大多数环境:
struct S {
char & a;
};
static_assert(sizeof(S) == sizeof(void *));