内容简介:http://stackoverflow.com/questions/27003727/does-this-really-break-strict-aliasing-rules
当我用g编译这个示例代码时,我得到这个警告:
warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
代码:
#include <iostream>
int main()
{
alignas(int) char data[sizeof(int)];
int *myInt = new (data) int;
*myInt = 34;
std::cout << *reinterpret_cast<int*>(data);
}
在这种情况下,数据别名不是int,因此将其返回到int不会违反严格的别名规则?还是我在这里遗漏的东西?
编辑:奇怪,当我定义这样的数据:
alignas(int) char* data = new char[sizeof(int)];
编译器警告消失了.堆栈分配是否与严格的混叠有所不同?事实上,它是一个char []而不是一个char *意味着它不能实际上任何类型的别名?
:
If, after the lifetime of an object has ended and before the storage
which the object occupied is reused or released, a new object is
a
, a reference that referredthe name of the original object will
and, once the lifetime of thenew object has started, can be used to manipulate the new object, if :
(7.1) — [..]
the new object is of the same type as the
original object (ignoring the top-level cv-qualifiers)
,新对象不是一个char数组,而是一个int. P0137 ,正式化了指点的概念,添加了洗衣:
[ Note : If these conditions are not met, a pointer to the new object
can be obtained from a pointer that represents the address of its
storage by calling std::launder
(18.6 [support.dynamic]). — end note
]
即您的代码段可以这样纠正:
std::cout << *std::launder(reinterpret_cast<int*>(data));
..或者只是从放置新的结果初始化一个新的指针,这也消除了警告.
http://stackoverflow.com/questions/27003727/does-this-really-break-strict-aliasing-rules
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Git命令别名设置
- mybatis的typeAliases别名
- Elasticsearch基础但非常有用的功能之一:别名
- Elasticsearch索引的基本操作(5)-别名设置
- Elasticsearch 技术分析(三): 索引别名Aliases问题
- javascript – 摆脱SVG循环元素上的别名
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
深入浅出HTML5编程
弗里曼 (Eric Friiman)、罗布森 (Elisabdth Robson) / 东南大学出版社 / 2012-4 / 98.00元
《深入浅出HTML5编程(影印版)(英文)》就是你的特快车票,它可以带你学习如何使用今天的标准同时也会是明日的最佳实践来搭建Web应用。同时,你会了解HTML5的新API的基本知识,甚至你还会弄明白这些API是如何与你的网页进行交互,JaVaScript如何为它们提供动力,以及你如何使用它们来搭建能够打动你的老板并且吸引你的朋友的Web应用。一起来看看 《深入浅出HTML5编程》 这本书的介绍吧!