空基优化子对象的地址
Address of an empty base optimized subobject
假设我有一个值:
int i = 0;
一个空 class 有资格进行空碱基优化:
struct Empty{
// stuff that passes
// static_assert( std::is_empty<Empty>::value );
};
是否合法:
Empty& e = *reinterpret_cast<Empty*>(reinterpret_cast<void*>(&i)); //?
// do stuff with e
根据此 online C++ standard draft,从一种指针类型转换为另一种指针类型然后返回是有条件有效的:
5.2.10 Reinterpret cast
(7) Converting a prvalue of type “pointer to T1” to the type “pointer
to T2” (where T1 and T2 are object types and where the alignment
requirements of T2 are no stricter than those of T1) and back to its
original type yields the original pointer value.
这意味着,从 int*
到 Empty*
的转换本身是有效的,只要 Empty
没有比 int
更严格的对齐要求,并且您稍后可以转换回 int*
.
但是请注意,这并不意味着您可以 access/dereference Empty*
-对象(因为它不是指针指向的 Empty
-对象) .
所以纯转换是可以的,但是取消引用它会产生 UB。
假设我有一个值:
int i = 0;
一个空 class 有资格进行空碱基优化:
struct Empty{
// stuff that passes
// static_assert( std::is_empty<Empty>::value );
};
是否合法:
Empty& e = *reinterpret_cast<Empty*>(reinterpret_cast<void*>(&i)); //?
// do stuff with e
根据此 online C++ standard draft,从一种指针类型转换为另一种指针类型然后返回是有条件有效的:
5.2.10 Reinterpret cast
(7) Converting a prvalue of type “pointer to T1” to the type “pointer to T2” (where T1 and T2 are object types and where the alignment requirements of T2 are no stricter than those of T1) and back to its original type yields the original pointer value.
这意味着,从 int*
到 Empty*
的转换本身是有效的,只要 Empty
没有比 int
更严格的对齐要求,并且您稍后可以转换回 int*
.
但是请注意,这并不意味着您可以 access/dereference Empty*
-对象(因为它不是指针指向的 Empty
-对象) .
所以纯转换是可以的,但是取消引用它会产生 UB。