草庐IT

c++ - 从 *char 数组转换时有哪些严格的别名规则?

在将char数组转换为其他类型时,我对严格的别名规则感到困惑。我知道允许将任何对象转换为char数组,但我不确定反过来会发生什么。看看这个:#includeusingnamespacestd;struct{alignas(int)charbuf[sizeof(int)];//correct?}buf1;alignas(int)charbuf2[sizeof(int)];//incorrect?struct{floatf;//obviouslyincorrect}buf3;typenamestd::aligned_storage::typebuf4;//obviouslycorrecti

c++ - Placement-new 与 gcc 4.4.3 严格别名规则

我有一些代码,多年来我一直在成功使用这些代码来实现“变体类型对象”;也就是说,一个C++对象可以保存各种类型的值,但只使用(大约)尽可能多的内存作为最大的可能类型。该代码在本质上类似于标记union,只是它也支持非POD数据类型。它通过使用char缓冲区、放置新/删除和reinterpret_cast来实现这一魔力。我最近尝试在gcc4.4.3(使用-O3和-Wall)下编译这段代码,并收到很多这样的警告:warning:dereferencingtype-punnedpointerwillbreakstrict-aliasingrules根据我的阅读,这表明gcc的新优化器可能会生成

c++ - C++ 中的严格别名规则和类型别名

我试图在违反严格的别名规则时了解未定义的行为。为了理解它,我阅读了很多关于SO的文章。然而,一个问题仍然存在:我真的不明白两种类型的别名是非法的。cpp-reference状态:TypealiasingWheneveranattemptismadetoreadormodifythestoredvalueofanobjectoftypeDynamicTypethroughaglvalueoftypeAliasedType,thebehaviorisundefinedunlessoneofthefollowingistrue:AliasedTypeandDynamicTypearesimi

c++ - C++ 中的共享内存缓冲区不违反严格的别名规则

我正在努力在不违反C99严格别名规则的情况下实现共享内存缓冲区。假设我有一些代码处理一些数据并且需要有一些“暂存”内存来运行。我可以这样写:voidfoo(...someargumentshere...){int*scratchMem=newint[1000];//Allocate.//Dostuff...delete[]scratchMem;//Free.}然后我有另一个函数可以做一些其他的事情,也需要一个临时缓冲区:voidbar(...arguments...){float*scratchMem=newfloat[1000];//Allocate.//Dootherstuff..

位域结构的 C++ 严格别名规则

下面的getValue()成员函数是否违反了c++严格的别名规则?根据标准,我认为setValue()违反了严格的别名规则,因为double既不是聚合类型也不是IEEE754_64的基类。getValue()怎么样?当数据成员是位字段形式时,是否是未定义的行为,如下例?我在一个大型项目中使用类似的代码。GCC-O2和-O3输出错误值。如果我添加-fno-strict-aliasing,问题就消失了。此外,如果我使用memcpy而不是在getValue()中强制转换,问题就消失了。不确定这是否是GCC错误。#include#includeusingnamespacestd;structI

c++ - 通过指向其派生类的指针访问类对象是否会违反严格的别名规则?

voidfoobar(Base*base){Derived*derived=dynamic_cast(base);//orstatic_castderived->blabla=0xC0FFEE;if(base->blabla==0xC0FFEE)...}在具有严格别名的编译器上,“derived”是“base”的别名吗? 最佳答案 只要有可能通过它们访问同一个对象,两个指针就被别名化了。该标准的第3.10/15段指定了对对象的访问何时有效。Ifaprogramattemptstoaccessthestoredvalueofanobj

Educational Codeforces Round 161 (Rated for Div. 2) E题 动态规划逼近,二进制拆分补充,注意严格递增strictly increasing

Problem-E-Codeforces目录推荐视频:题意:细节(我踩得没什么价值的坑):思路:对样例3(X=13)做解释:——————总思路:——————动态规划逼近:——————二进制拆分补充剩余:核心代码: 推荐视频:E_哔哩哔哩_bilibili其实有一些细节说的不是特别清楚好理解,可以结合我的题解来看。但是对题目的解析说的还是特别好的 题意:你需要制作一个数组,使其严格递增子序列的数目为X细节(我踩得没什么价值的坑):1.严格递增strictlyincreasing,我直到看了别人的题解才发现,,才能看懂样例,,2.好好读题,我靠X是1e18了,得longlong3.快速逼近的时候w

c++ - 我是否正确理解 C/C++ 严格别名?

我读过thisarticleaboutC/C++strictaliasing.我认为这同样适用于C++。据我了解,严格别名用于重新排列代码以实现性能优化。这就是为什么两个不同(在C++情况下不相关)类型的指针不能引用相同的内存位置。这是否意味着只有修改内存才会出现问题?除了可能的问题withmemoryalignment.例如,处理网络协议(protocol),或反序列化。我有一个字节数组,动态分配并且数据包结构正确对齐。我可以reinterpret_cast它到我的数据包结构吗?charconst*buf=...;//dynamicallyallocatedunsignedinti=

c++ - 在 g++ 中启用严格的别名警告

在g++中启用严格别名警告的正确方法是什么?VC++10是否实现了这些规则? 最佳答案 对g++使用-fstrict-aliasing。我还使用-Wstrict-aliasing=2查看与可能违反严格别名规则的行为相关的警告。 关于c++-在g++中启用严格的别名警告,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8552802/

c++ - 严格的混叠违规

下面的程序是否违反了严格的别名规则?#includeintmain(){doubled=0.1;//std::int64_tn=*reinterpret_cast(&d);//aliasingviolation//auton{*reinterpret_cast(&d)};//aliasingviolationautonptr{reinterpret_cast(&d)};auto&n{*nptr};++n;}VS2015没有发出警告,clang或gcc. 最佳答案 Doesthefollowingprogramviolatethest