草庐IT

Bug优化

全部标签

c++ - 如何优化 SIMD 转置函数(8x4 => 4x8)?

我需要使用AVX优化8x4和4x8浮点矩阵的转置。我使用AgnerFog的vectorclasslibrary.青色任务-构建BVH并求和最小值-最大值。转置用于每个循环的最后阶段(它们也通过多线程进行了优化,但任务确实很多)。代码现在看起来像:voidtranspose(registerVec4f(&fin)[8],registerVec8f(&mat)[4]){for(inti=0;i(Vec4i(0,8,16,24)+i,(float*)mat);}}需要优化的变体。如何为SIMD优化此功能?我最近用vector类编写了自己的转置变体(4x8和8x4)。版本1.0。voidtra

c++ - 返回成员变量时,编译器是否进行返回值优化?

给定以下代码classfoo{private:boost::shared_ptr>m_ptr;public:foo();boost::shared_ptr>get_my_ptr(){returnm_ptr;}};当我们像这样调用get_my_ptr()函数时boost::shared_ptr>ptr=get_my_ptr()编译器是调用拷贝构造函数创建ptr对象还是执行nrvo?和我们这样叫有什么区别constboost::shared_ptr>&ptr=get_my_ptr() 最佳答案 使用NRVO,编译器可以省略复制和移动构造

c++ - 编译器优化打破了惰性迭代器

我用自定义迭代器编写了一个自定义容器。由于容器的特殊特性,必须延迟计算迭代器。为了这个问题,代码的相关部分是以这种方式实现的迭代器的取消引用运算符templatestructContainer{vectorm_Inner;//Thisshouldcalculatetheappropriatevalue.//Inthisexampleistakenfromavecbutin//therealuse-caseiscalculatedonrequestTValue(intN){m_Inner.at(N);}}templatestructLazy_Iterator{mutablepairm_C

c++ - 内联和死代码删除优化能否阻止模板实例化?

给定以下示例代码structS;templateclassC{public:voidf(boolb){if(b)g();}voidg(){S{};}};intmain(){C{}.f(false);}GCC正确报告以下内容:example.cpp:Ininstantiationof'voidC>::g()[with=int]':10:requiredfrom'voidC>::f(bool)[with=int]'21:requiredfromhere15:error:invaliduseofincompletetype'structS'我现在的问题是:这种保证行为是否在标准或任何其他文件

c++ - 通过从 C++ 中的字符串中删除垃圾字符来优化大小

我有两个版本的HelloWorld程序:#includeintmain(){std::cout和#includeintmain(){std::cout如果执行严格的大小优化,我希望这些二进制文件的大小不同。但是,当我使用g++-Os-otesttest.cpp-Wl,--strip-all(使用GCC5.4.0)进行编译时,我得到的文件相同大小(在我的系统上为6336,即Ubuntu)。这意味着对于最小大小的缓冲区有一些垃圾空间(尽管在这个例子中我希望字符串是constchar[])。我的问题:这个缓冲区的性质是什么以及如何从生成的二进制文件中删除垃圾字符?

c++ - 在 GLSL 中优化光线追踪着色器

我编写了一个基于体素化的光线追踪器,它按预期工作但速度很慢。目前raytracer代码如下:#version430//normalizedpositonfrom(-1,-1)to(1,1)invec2f_coord;outvec4fragment_color;structVoxel{vec4position;vec4normal;vec4color;};structNode{//childrenofthecurrentnodeintchildren[8];};layout(std430,binding=0)buffervoxel_buffer{//lastlayerofthetree,

c++ - 在 Linux 上的发布/优化二进制文件中的信号处理程序中打印回溯

问题是关于在优化的二进制文件中以编程方式打印有意义的堆栈跟踪。例如我们可以使用backtrace、backtrace_symbols、abi::__cxa_demangle来打印堆栈跟踪。但据我所知,我们需要使用编译器标志-g构建二进制文件,而不是高于-O1优化标志。我能做到这一点。我期待在发布二进制文件中生成具有正确函数名称的回溯,例如使用-O3标志编译。它可行吗?我对此做了很多研究,但没有得到任何实质性的东西。更新1:有没有一种方法可以让我们拥有一个包含一些符号的辅助文件,并且可以引用它来从优化的二进制进程中生成堆栈跟踪? 最佳答案

c++ - C++ 编译器会优化掉未使用的返回值吗?

如果我有一个返回对象的函数,但调用者从未使用过这个返回值,编译器会优化掉拷贝吗?(可能是总是/有时/从不回答。)基本示例:ReturnValueMyClass::FunctionThatAltersMembersAndNeverFails(){//DostufftomembersofMyClassthatneverfailsreturnsuccessfulResultObject;}voidMyClass::DoWork(){//DosomestuffFunctionThatAltersMembersAndNeverFails();//Domorestuff}在这种情况下,Return

c++ - 如何优化此后缀表达式树以提高速度?

感谢我在this中得到的帮助帖子:我有一个漂亮、简洁的递归函数来按后缀顺序遍历树:dequed;voidNode::postfix(){if(left!=__nullptr){left->postfix();}if(right!=__nullptr){right->postfix();}d.push_front(cargo);return;};这是一个表达式树。分支节点是从数组中随机选择的运算符,叶节点是值或变量'x',也是从数组中随机选择的。char*values[10]={"1.0","2.0","3.0","4.0","5.0","6.0","7.0","8.0","9.0","

c++ - 将位设置为 double 并使用 g++ 的优化标志进行编译

我正在尝试将位设置为double(IEEE标准754)。说我想“构建”一个3,我会设置双浮点表示的第51位和第62位,这样我得到二进制1.1*2,十进制为3。我写了这个简单的main:intmain(){doublet;uint64_t*i=reinterpret_cast(&t);uint64_tone=1;*i=((one这个的输出将是88883当使用g++4.3编译并且没有优化时。但是,如果我添加-O2或-O3优化标志,我会得到一个奇怪的行为。也就是说,如果我让main保持原样,我会得到相同的输出。但是,如果我删除输出4sizeof的行,那么我将得到输出0没有sizeof输出的未