草庐IT

c - 严格的别名和内存位置

严格的别名防止我们使用不兼容的类型访问相同的内存位置。int*i=malloc(sizeof(int));//assumingsizeof(int)>=sizeof(float)*i=123;float*f=(float*)i;*f=3.14f;根据C标准,这将是非法的,因为编译器“知道”int不能被float左值访问。如果我使用该指针指向正确的内存会怎样,如下所示:int*i=malloc(sizeof(int)+sizeof(float)+MAX_PAD);*i=456;首先我为int、float分配内存,最后一部分是允许float存储在对齐地址上的内存。float需要以4的倍数对

c++ - 在 C++ 中, "access"在严格的别名规则中是什么意思?

3.10/10说:Ifaprogramattemptstoaccessthestoredvalueofanobjectthroughaglvalueofotherthanoneofthefollowingtypesthebehaviorisundefined:但是,“访问”一词在任何地方都没有定义。在这种情况下,它是指读取,还是读取或修改?在C标准中,它被明确定义为读取或修改。但是在C++11中,它似乎在不同的时间有不同的含义,例如:1.9/8:Accesstovolatileobjectsareevaluatedstrictlyaccordingtotherulesoftheabstr

c++ - 严格的别名,-ffast-math 和 SSE

考虑以下程序:#include#include#include#includeusingnamespacestd;intmain(){//4float32s.__m128nans;//Setthemallto0xffffffffwhichshouldbeNaN.memset(&nans,0xff,4*4);//cmpordshouldreturnamaskof0xffffffffforanynon-NaNs,and0x00000000forNaNs.__m128mask=_mm_cmpord_ps(nans,nans);//ANDthemaskwithnanstozeroanyofth

c++ - 是否使用 new char[] 或 malloc 的结果来转换 float * is IN(严格的别名违规)?

其中哪些代码有UB(具体来说,违反了严格的别名规则)?voida(){std::vectorv(sizeof(float));float*f=reinterpret_cast(v.data());*f=42;}voidb(){char*a=newchar[sizeof(float)];float*f=reinterpret_cast(a);*f=42;}voidc(){char*a=newchar[sizeof(float)];float*f=new(a)float;*f=42;}voidd(){char*a=(char*)malloc(sizeof(float));float*f=r

c++ - std::pair: 过于严格的构造函数?

我偶然发现了新的std::pair的一个令人惊讶的行为。构造函数,它是在C++11中引入的。我在使用std::pair>时发现了这个问题,它发生了,因为std::atomic既不能复制也不能移动。在下面的代码中,我替换了std::atomic与foobar为了简化。以下代码编译良好,使用GCC-4.9和Clang-3.5(有和没有libc++):structfoobar{foobar(int){}//implicitconversion//foobar(constfoobar&)=delete;};std::pairp{1,2};这种行为是预期的。但是,当我删除foobar的复制构造函

c++ - 编辑数组以确保严格增加值

考虑一个排序的vectorx介于min之间和max.以下是此类x的示例在哪里min可能是0和max可能是12:x=c(0.012,1,exp(1),exp(1)+1e-55,exp(1)+1e-10,exp(1)+1e-3,3.3,3.33333,3.333333333333333,3+1/3,5,5,10,12)5和5以及exp(1)和exp(1)+10^(-55)具有完全相同的值(达到float的准确度)。其他一些条目差异很大,而另一些条目差异很小。我想考虑一个近似相等测试ApproxEqual=function(a,b)abs(a-b),其中epsilon可能是1e-5例如。目标

c++ - fp :precise vs. fp: 严格性能

我检测到发布版本和调试版本之间的程序结果存在一些差异。经过一些研究,我意识到一些浮点优化导致了这些差异。我已经通过使用fenv_accesspragma禁用一些关键方法的优化来解决了这个问题。想了想,我意识到在我的程序中使用fp:strict模型可能比fp:precise更好,因为它的特性,但我担心性能。我试图找到一些关于fp:strict的性能问题或精确和严格模型之间的性能差异的信息,但我发现的信息很少。有人知道吗?提前致谢。 最佳答案 这是因为您在32位模式下编译,它使用x86浮点处理器。代码优化器删除了从FPU寄存器到内存并返

c++ - 通过 C 强制转换访问结构的第一个字段是否违反了严格的别名?

此代码是否违反严格别名?struct{intx;}a;*(int*)&a=3更抽象地说,只要原始读/写操作类型正确,在不同类型之间进行强制转换是否合法? 最佳答案 首先,在C中强制转换是合法的。§6.7.2.1/13:Withinastructureobject,thenon-bit-fieldmembersandtheunitsinwhichbit-fieldsresidehaveaddressesthatincreaseintheorderinwhichtheyaredeclared.Apointertoastructureob

c++ - 哪种内存分配算法最适合性能和时间要求严格的 C++ 应用程序?

我问这个问题是为了确定哪种内存分配算法可以为性能关键的应用程序(如游戏引擎或嵌入式应用程序)提供更好的结果。结果实际上取决于内存碎片的百分比和内存请求的时间确定性。教科书中有几种算法(例如Buddy内存分配),但也有其他算法,例如TLSF。因此,关于可用的内存分配算法,哪一种是最快的并且导致更少的碎片。顺便说一句,垃圾收集器不应该包括在内。另外请注意,这个问题不是关于分析的,它只是为了找出满足给定要求的最佳算法。 最佳答案 Italldependsontheapplication.例如,可以在特定时刻清除与特定请求相关的所有内存的服

c++ - gcc -Wshadow 太严格了?

在以下示例中:classA{public:intlen();voidsetLen(intlen){len_=len;}//warningatthislineprivate:intlen_;};带有-Wshadow的gcc发出警告:main.cpp:4:warning:declarationof`len'shadowsamemberof`this'函数len和整数len是不同的类型。为什么会出现警告?更新我看到人们对“影子”的含义有着广泛的共识。从形式上看,编译器完全按照它的意图去做。但是恕我直言,该标志是不实用的。比如常用的setter/getter成语:classA{voidprop