内容简介: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循环元素上的别名
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Objective-C编程
[美] Aaron Hillegass / 夏伟频、李骏 / 华中科技大学出版社 / 2012-9-25 / 58.00元
《Objective-C编程》讲述Objective-C编程语言和基本的iOS/Mac开发知识。作者首先从基本的编程概念讲起(变量、条件语句、循环结构等),接着用浅显易懂的语言讲解Objective-C和Foundation的知识,包括Objective-C的基本语法、 Foundation常用类 、内存管理、常用设计模式等,最后手把手教读者编写完整的、基于事件驱动的iOS/Mac应用。作者还穿插......一起来看看 《Objective-C编程》 这本书的介绍吧!