草庐IT

strict-aliasing

全部标签

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

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

c++ - 通过重新解释转换创建无效引用

我正在尝试确定以下代码是否调用了未定义的行为:#includeclassA;voidf(A&f){char*x=reinterpret_cast(&f);for(inti=0;i(newchar[5])f(*a);}我的理解是reinterpret_cast和char*是兼容的,因为标准允许使用char和unsignedchar别名指针(强调我的):Ifaprogramattemptstoaccessthestoredvalueofanobjectthroughanlvalueofotherthanoneofthefollowingtypesthebehaviorisundefined

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

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

c++ - Vulkan-hpp 正在将非标准布局类重新解释为另一个类。这是合法的吗?

最近我一直在使用Vulkan-Hpp(VulkanApi的官方c++绑定(bind),GithubLink)。查看源代码,我发现他们围绕原生Vulkan结构创建了包装器类(例如vk::InstanceCreateInfo围绕着VkInstanceCreateInfo)。(注意:环绕,而不是派生自)调用nativeVulkanAPI时,指向包装器类的指针被reinterpret_cast编辑到nativeVulkan结构中。使用vk::InstanceCreateInfo的示例://definitionofvk::InstanceCreateInfostructInstanceCreat

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++ - char* 与先前指令中设置的值的比较未优化?

在摆弄一些测试代码时,我在以下代码中观察到:externchar*pc;intmuysimple(){*pc=0;if(*pc!=0){return1111;}return4444;}比较没有被我在godbolt上选择的任何编译器优化掉.如果我将externchar*更改为externint*,比较将被优化掉。为什么gcc和clang都保留对char的比较,即使这段代码中似乎没有任何内容可以合法地更改值以使比较的计算结果为真?语言规范中是否有任何内容禁止通过char*进行写入/读取优化(但允许优化int*!)还是优化器只是对char更加保守?正如评论中已经提到的那样:我不明白--明智的

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

c++ - 违反严格别名规则的类型转换

我有一个函数需要一个unsignedlong*并且需要将它传递给一个外部库,这个外部库需要一个unsignedint*并且在这个平台上unsignedint/long是相同的大小。voidUpdateVar(unsignedlong*var){//thisfunctionwillchangethevalueattheaddressofvarExternalLibAtomicUpdateVar((unsignedint*)var);//libatomicallyupdatesvariable}这会生成一条警告,说明它违反了严格的别名规则。有什么变通办法吗?谢谢编辑:我很抱歉没有说清楚。该