草庐IT

strict-aliasing

全部标签

c++ - 如何创建不破坏严格别名的 uint8_t 数组?

我最近问了这个问题:Usingthispointercausesstrangedeoptimizationinhotloop问题是我正在写入类型为uint8_t的数组,编译器将其视为可以使用方法的this指针(类型structT*),因为void*和char*(=uint8_t*)总是可以别名任何其他指针在C++中。此行为导致错失优化机会。当然,我想避免这种情况。所以问题是:我能否声明一个uint8_t数组来强制执行严格的别名,即编译器将其视为从不与任何其他类型的指针别名?即,我正在寻找类似strict_uint8_t类型的东西,它是具有特殊别名行为的uint8_t。有办法实现吗?显示

c++ - 严格指针别名 : any solution for a specific problem?

我遇到了违反严格的指针别名规则引起的问题。我有一个来自模板的类型T和一些相同大小的整数类型Int(与sizeof一样)。我的代码主要执行以下操作:Tx=some_other_t;if(*reinterpret_cast(&x)==0)...因为T是一些可以有构造函数的任意(除了大小限制)类型,我不能将T和Int。(这仅在C++0x中允许,甚至还不被GCC支持)。有什么方法可以重写上述伪代码以保留功能并避免违反严格的别名规则吗?请注意,这是一个模板,我无法控制T或some_other_t的值;分配和后续比较确实发生在模板代码中。(郑重声明,如果T包含任何位字段,则上述代码在GCC4.5上

c++ - 以符合标准的方式使用与数组相同类型的成员重新解释结构

这个问题在这里已经有了答案:Castingdoublearraytoastructofdoubles(6个答案)关闭5年前。在各种3d数学代码库中,我有时会遇到这样的事情:structvec{floatx,y,z;float&operator[](std::size_ti){assert(iAFAIK是非法的,因为允许实现在成员之间虚假地添加填充,即使它们属于同一类型,但实际上没有人会这样做。这可以通过static_assert施加约束来合法化吗?static_assert(sizeof(vec)==sizeof(float)*3);即static_assert未被触发是否意味着ope

c++ - 缓冲区填充不同类型的数据,并严格别名

根据thestandard,在C++中总是未定义的行为,例如,使float*指向与int*相同的内存位置,然后从它们读取/写入。在我的应用程序中,可以有一个缓冲区,其中填充了32位整数元素,这些元素被32位浮点元素覆盖。(它实际上包含图像的表示,由GPU内核在多个阶段进行转换,但也应该有一个执行相同处理的主机实现,以进行验证。)程序基本上是这样做的(不是实际的源代码):void*buffer=allocate_buffer();//properlyalignedbufferstatic_assert(sizeof(std::int32_t)==sizeof(float),"mustha

c++ - 使用不遵循 'strict weak ordering' 的比较函数对列表进行排序

我有一个包含10个项目的列表。我想以特定方式对它们进行排序。例如。项目是A1,B,C1,A2,A3,F,G,C2,H,A4规则是C应该总是在A之前B应该总是在A之后所有其他项目应保持其顺序。所以排序后列表应该是这样的顺序C1C2A1A2A3FGHA4B我正在尝试使用C++std::stable_sort()方法来实现这一点。在我的程序中,所有项目都是结构“SItem”的实例,它有一个成员“type”来指示其类别(A、B等)。我的比较函数是这样的boolCompareItems(SItemconst&item1,SItemconst&item2){if(item1.type==A&&it

c++ - 这个严格的别名示例是否正确?

在过去一周左右的时间里,我一直在阅读严格的别名规则,并遇到了这篇文章:UnderstandingC/C++StrictAliasing.这篇文章介绍了几种交换32位整数的一半的方法,给出了很好的例子和违反严格别名规则的例子。不过,我无法理解其中一个示例。此代码被描述为已损坏。uint32_tswaphalves(uint32_ta){a=(a>>16)|(a给出的原因是:Thisversionlooksreasonable,butyoudon'tknowiftherightandleftsidesofthe|willeachgettheoriginalversionofaorifone

c++ - 通过 union 在 C 和 C++ 中输入双关结构

我已经在gcc和g++中用pedantic编译了这个,我在任何一个中都没有收到警告:#include#include#includestructa{structa*next;inti;};structb{structb*next;inti;};structc{intx,x2,x3;union{structaa;structbb;}u;};voidfoo(structb*bar){bar->next->i=9;return;}intmain(intargc,char*argv[]){structcc;memset(&c,0,sizeofc);c.u.a.next=(structa*)ca

c++ - 避免违反严格别名规则的最简单经验法则?

在阅读另一个关于别名的问题(Whatisthestrictaliasingrule?)及其最佳答案时,我意识到我仍然不完全满意,尽管我认为我已经完全理解了。(这个问题现在被标记为C和C++。如果您的答案仅涉及其中之一,请说明是哪一个。)所以我想了解如何在这个领域进行一些开发,以积极的方式转换指针,但使用一个简单的保守规则来确保我不会引入UB。我在这里有这样一条规则的建议。(更新:当然,我们可以避免所有类型的双关语。但这不是很有教育意义。除非当然,除了union异常。)更新2:我现在明白为什么这个问题中提出的方法不正确了。然而,了解是否存在简单、安全的替代方案仍然很有趣。截至目前,至少有

c++ - std::is_sorted 和 strictly less 比较?

我不太明白std::is_sorted算法及其默认行为。如果我们查看cppreference,它表示默认情况下std::is_sorted使用运算符(operator)。相反,我发现使用会很自然。但我的问题是,对于以下数字列表:123345它将返回true,即使3应该是false.这怎么可能?编辑:它似乎比我想象的更糟糕,因为通过了std::less_equal在这种情况下将返回false...当我传递比较器函数时应用的条件是什么? 最佳答案 根据25.4/5:Asequenceissortedwithrespecttoacompa

c++ - 访问 POD 结构数组作为其单个成员的数组是否违反严格别名?

我有整数值用于访问不相关数据存储中的数据,即句柄。我选择将整数包装在一个结构中,以便拥有强类型对象,这样不同的整数就不会混淆。它们是而且必须是POD。这是我正在使用的:structMesh{inthandle;};structTexture{inthandle;};我有这些句柄的数组,例如:Texture*textureHandles;。有时我需要将句柄数组作为int*传递给代码的更通用部分。现在我正在使用:int*handles=&textureHandles->handle;它本质上采用指向结构的第一个元素的指针并将其解释为数组。我的问题基本上是这是否合法,或者它是否违反严格的别名