1)你的方法有效:
与...一起工作const
指针确保常量不会被抛弃:
5.2.10/2reinterpret_cast 运算符不应放弃常量性。
指针转换是安全的,因为char
没有比以下更严格的对齐要求some_type
,以便您可以转换rep
回到一个some_type*
:
5.2.10/7对象指针可以显式转换为不同类型的对象指针。 (...) 转换类型的纯右值
“指向 T1 的指针”到“指向 T2 的指针”类型(其中 T1 和 T2 是
对象类型并且没有 T2 的对齐要求
比 T1 更严格)并返回其原始类型,得出
原始指针值。
Edit:根据我的理解,指向对象的指针和指向其表示的指针之间的相互转换是毫无疑问的:
1.8/6:除非对象是位域或大小为零的基类子对象,否则该对象的地址是第一个对象的地址
它占用的字节。
3.9/4:T 类型对象的对象表示是序列N 个 unsigned char 对象被物体占据T 型,
其中 N 等于 sizeof(T)。
据我所知,“占用”是“占用”的同义词。另请注意,&
运营商保证:
5.3.1/3:(...) 如果表达式的类型为 T,则结果的类型为“指向 T 的指针”,并且是纯右值,即
指定对象
2) 对象表示用对象初始化:
这是从值表示的定义以及内存模型和对象生命周期中得出的。
但是,您的示例更复杂:
-
rep[0]
尽管有此属性,但如果它仅由填充位组成,则可能仍然是一个未确定的值。您的示例就是这种情况,因为该对象的大小至少为 1,但由于其中没有成员,因此值表示形式为空。
-
rep[1]
可以是未定义的行为,如果sizeof(some_type)<2
因为取消引用传递数组最后一个元素的指针是 UB。
3)对象表示是什么(用简单的语言)?
让我们举一个简单的例子:
class some_other_type {
int a;
std::string s;
};
在谈论对象占用的内存时存在歧义:
- 是否只是与其类型相对应的固定大小的连续内存(即
int
, some size_t
字符串的长度和一些指向字符串中字符的指针,就像在 C 中所做的那样)?
- 或者是存储在对象内存中的所有值,包括存储在其他地方分配的内存位置中的某些值(例如,还有存储字符串值所需的字节)?
The 对象表示对应第一部分。对于不可简单复制的对象,对象表示形式是不够的(即在我们的示例中,存储在字符串中的字节不一定是对象表示形式的一部分)。
The 价值表示对应于第二部分(并且包括存储字符串值所需的字节)。
简单来说,这意味着对象的地址is其表示的地址,但对象表示可能包含填充,并且可能不足以保存属于该对象的每个数据。