c++ 这是否真的破坏了严格的别名规则?

栏目: C++ · 发布时间: 7年前

内容简介: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 *意味着它不能实际上任何类型的别名?

警告是绝对合理的.指向数据的衰减指针不指向int类型的对象,并且转换它不会改变.见 [basic.life]/7

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

created at the storage location which the original object occupied,

a

, a reference that referred
to the original object, or

the name of the original object will

and, once the lifetime of the

new object has started, can be used to manipulate the new object, if :

(7.1) — [..]

(7.2) —

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


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

R语言编程艺术

R语言编程艺术

(美)Norman Matloff / 陈堰平、邱怡轩、潘岚锋 等 / 机械工业出版社 / 2013-5 / 69.00

【编辑推荐】 这本书涵盖了R语言编程的诸多方面,尤其在面向对象编程、程序调试、提升程序运行速度以及并行计算等方面,填补了同类图书的空白。关于程序调试的章节更是作者多年经验的总结。不管是初学者还是有一定编程经验的读者,阅读这本书都会有所收获。 ——统计之都 【内容简介】 R语言是世界上最流行的用于数据处理和统计分析的脚本语言。考古学家用它来跟踪古代文明的传播,医药公司用它来探......一起来看看 《R语言编程艺术》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试