草庐IT

dp优化

全部标签

c++ - 内存 [取消] 分配成本和潜在的编译器优化 (c++)

是否明确定义了内存[de]分配的成本?如果成本取决于所使用的特定编译器,是否有实现内存[解除]分配的通用方法,以便我可以合理地承担成本?编译器是否能够优化以下代码,使对“new”的调用只执行一次?char*arr=NULL;for(size_ti=0;i 最佳答案 编译器几乎肯定无法执行此优化。在最低级别,存储分配归结为对库函数的调用,例如malloc(以及更深一层,对OSAPI)的调用。对于编译器来说,假设可以忽略单个malloc/free对并重用它们的存储是不安全的,因为它们的实现应该在优化器的范围之外。除此之外,我认为这对优化

c++ - 优化后的虚拟调用成本

当指向的类型始终相同时,我对虚拟调用的成本有疑问:classBase{Base(){};virtualvoidFunc()=0;};classDerived:publicBase{Derived():Base(){};voidFunc(){/*Dosomething*/};};intmain(){Base*base=newDerived;for(inti=0;iFunc();}return0;}编译器会优化这个虚拟调用吗? 最佳答案 带有-O3的GCC似乎没有优化虚拟调用。https://goo.gl/TwZD6T.L5movq(%

c++ - 一个空的类会被优化掉吗

假设我有以下类(class):classA{};然后在我的代码中有一个函数:Afoo(){Aret;//Dostuffreturnret;}然后我稍后使用该函数......优化编译器(如g++)是否会将foo()视为void函数并跳过实际为空对象分配内存?它可能不会这样做,因为即使空类的大小也为1。 最佳答案 这是gcc.godbolt.org的用例您可以在其中查看生成的汇编代码(我建议您单击着色按钮以查看哪个C++代码对应于哪个汇编代码)。您可以看到即使使用-O0也没有生成代码来分配或复制对象。您可以尝试使用其他编译器和优化级别。

c++ - 在没有返回值优化的情况下将两个对象相加会创建多少个临时对象?

在阅读ScottMeyers的“更有效的C++”一书的第20和22项之后,我决定问这个问题。假设您编写了一个类来表示有理数:classRational{public:Rational(intnumerator=0,intdenominator=1);intnumerator()const;intdenominator()const;Rational&operator+=(constRational&rhs);//Doesnotcreateanytemporaryobjects...};现在假设您决定使用operator+=实现operator+:constRationaloperato

c++ - 使用 "pointer to volatile"是否始终阻止编译器优化?

这里是问题所在:yourprogramtemporarilyusessomesensitivedataandwantstoeraseitwhenit'snolongerneeded.使用std::fill()本身并不总是有帮助-编译器可能会决定以后不会访问内存块,因此删除它是浪费时间并消除删除代码。Userybungalobill建议usingvolatilekeyword:{charbuffer[size];//obtainandusepasswordstd::fill_n((volatilechar*)buffer,size,0);}目的是在看到volatile关键字时,编译器将不

c++ - 是否有针对 C++ 优化编译器的良好测试?

我正在评估基于简单代码示例的VisualC++10优化编译器,看看生成的机器代码有多好,到目前为止我没有创意用例。是否有一些示例代码库通常用于评估优化C++编译器的好坏? 最佳答案 唯一有效的基准是模拟您正在开发的代码类型的基准。优化器对不同的应用程序和不同的编码风格有不同的react,唯一真正重要的是您将使用编译器编译的代码。 关于c++-是否有针对C++优化编译器的良好测试?,我们在StackOverflow上找到一个类似的问题: https://stac

c++ - 优化头痛 - 从查找表中删除 if's

我正在尝试优化以下代码,这是我的应用程序中的瓶颈。它的作用:它采用double值value1和value2并尝试找到包含校正因子的最大值。如果两个值之间的差异大于5.0(LUT按因子10缩放),我可以取这两个值的最大值。如果差异小于5.0,我可以使用LUT中的校正因子。有没有人知道什么是这段代码的更好风格?我不知道我在哪里浪费了时间-是大量的ifs还是乘以10?doublevalue1,value2;//LookupTablescaledby10for(ln(1+exp(-abs(x)))),whichisalmost0forx>5andsymmetricalaround0.LUT[0

c++ - GCC 是否优化 std::tie 仅用于可读性?

假设我有一个std::tuple:std::tuplet={1,2,3,4};我想使用std::tie只是为了这样的可读性目的:inta,b,c,d;//inrealcontextthesenameswouldbemeaningfulstd::tie(a,b,c,d)=t;对比只使用t.get(0)等GCC会优化这个元组的内存使用还是会为a,b,c,d分配额外的空间?变量? 最佳答案 在这种情况下,我看不出有任何理由不这样做,在as-ifrule下编译器只需要模拟程序的可观察行为。快速实验usinggodbolt:#include#

c++ - char* 与先前指令中设置的值的比较未优化?

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

c++ - GCC 似乎错过了简单的优化

我正在尝试引入一个具有三元运算符语义的通用函数:E1?E2:E3。我看到编译器能够根据三元运算符的E1条件消除E2或E3之一的计算。然而,GCC在ternary函数调用的情况下错过了这种优化(即使E2/E3没有副作用)。在下面的列表中,函数ternary的行为类似于三元运算符。然而,GCC可能会发出对函数f的潜在大量调用,这似乎可以消除某些输入值(对于三元运算符来说正是这样做的),因为f是用纯属性声明的-请查看GCC生成的汇编代码的godbolt链接。它是否可以在GCC中进行改进(优化空间)或C++标准是否明确禁止此类优化?//Veryheavyfunctionintf()__attr