我知道标准中明确允许以下内容:
int n = 0;
char *ptr = (char *) &n;
cout << *ptr;
那这个呢?
alignas(int) char storage[sizeof(int)];
int *ptr = (int *) &storage[0];
*ptr = 0;
cout << *ptr;
本质上,我在问别名规则是否允许通过指向另一种类型的指针来访问字符序列。如果可能,我希望引用该标准的各个部分,以指示一种或另一种方式。
标准的某些部分使我产生了冲突。(3.10.10)似乎表明它的动态类型storage
为not ,这将是未定义的行为int
。但是,动态类型的定义对我来说还不清楚,并且存在的存在std::aligned_storage
会让我相信这是可能的。
该代码int *ptr = (int *) &storage[0]; *ptr = 0;
通过违反严格的别名规则(C ++ 14 [basic.lval] / 10)导致未定义的行为
被访问的对象具有type,char
但用于访问的glvalue具有type int
。
的“对象的动态类型”char
仍然是char
。(在派生类的情况下,动态类型仅与静态类型不同)。C ++也没有C的“有效类型”的等效项,它允许通过使用赋值运算符到malloc的空间中来“创建”类型化的对象。
关于的正确使用std::aligned_storage
,您应该使用newplacement在存储中创建一个对象。可以考虑使用new-placeing来结束char
(或任何其他)对象的生命周期,并创建指定类型的(动态存储持续时间)新对象,并重新使用同一存储。这样就不会出现严格的别名冲突。
您可以对char数组执行相同的操作,例如:
alignas(int) char storage[sizeof(int)];
int *ptr = new(storage) int;
*ptr = 0;
cout << *ptr;
请注意,delete
内置type不需要伪析构函数调用或int
。如果使用具有非平凡初始化的类类型,则需要这样做。链接到进一步阅读
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句