草庐IT

OPTIMIZATION

全部标签

c++ - "Empty base optimization"用于 lambda 捕获 - 被标准禁止?为什么?

我最近遇到了一种情况,我最终得到了大量嵌套的lambda表达式到buildasynchronouscomputationchains。.templatestructnode:F{node(F&&f):F{std::move(f)}{}templateautothen(FThen&&f_then){return::node{[p=std::move(*this),t=std::move(f_then)](){}};}};intmain(){autof=node{[]{}}.then([]{}).then([]{});returnsizeof(f);}我在lambda中捕获的所有对象都是空

c++ - 在某些静态库中打开整个程序优化会显着增加库的大小!

在VisualStudio2010中,我有一个C/C++静态库项目。当我在release模式下打开选项wholeprogramoptimization时,我得到了一个超过90MB的.lib文件!当我关闭这个选项时,大小减少到24MB。该库包含数百个使用proto-buffer生成的类。我想知道为什么这个选项会增加尺寸?在什么情况下我们必须关闭它?编辑:将MO更改为MB感谢chrisaycock 最佳答案 整个程序优化意味着直到链接阶段才进行优化。静态库的大小不是看的东西。在这种模式下,静态库可能充满了最终优化/链接阶段所需的额外信息

c++ - GCC 优化 : how can less operations be slower?

在尝试对我的代码的某些选项进行基准测试时(使用或不使用128位整数),我观察到一种我无法理解的行为。任何人都可以阐明这一点吗?#include#include#includeintmain(inta,char**b){printf("Runningtests\n");clock_tstart=clock();unsigned__int128t=13;for(unsignedlongi=0;i(注意这里有printf,这样gcc就不会优化for循环)在我的系统上,这可靠地产生了以下输出:u128,+25,took2.411922su128,no+,took1.799805su64,+25

C++:编译器能否优化按值传递?

一种众所周知的编译器优化是所谓的返回值优化。这种优化基本上允许编译器不复制从函数返回的局部变量,而是移动它。但是,我想知道如果已知函数的返回值将覆盖原始参数,是否也可以通过值将参数传递给函数。这是一个例子。假设我们有以下功能:std::vectormodify(std::vectordata){/*Dosomefunnythingstodata*/returndata;}然后按以下方式使用此函数:std::vectorbigData=/*bigdata*/;bigData=modify(bigData);//Herecopyingthedataintothefunctioncouldb

c++ - 编译器会简化按顺序执行多次的操作吗?

这个问题我想了很久,但一直不知道去哪里找。如果多次编写某个操作,编译器会简化它还是会运行完全相同的操作并得到完全相同的答案?例如,在下面的类似c的伪代码中,(i%3)*10被重复了很多次。for(inti=0;i我知道变量对于视觉目的会更好,但它也更快吗?(i%3)*10是否每个循环计算5次?在某些情况下,我不知道是使用变量更快还是直接离开原来的操作。编辑:在win10上使用gcc(MinGW.orgGCC-8.2.0-3)8.2.0 最佳答案 完成哪些优化取决于编译器,compileroptimizationflag(s)您指定的

c++ - 编译器如何优化我们的代码?

很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visitthehelpcenter.关闭12年前。我在回答另一个人的问题时遇到了这个问题。编译器如何优化代码?像const,...这样的关键字有帮助吗?除了使用volatiles和内联函数以及如何自行优化代码之外!

c++ - SSE2 : Double precision log function

我需要日志功能的开源(无许可证限制)实现,有签名的东西__m128d_mm_log_pd(__m128d);它在英特尔短vector数学库(ICC的一部分)中可用,但ICC既不是免费的也不是开源的。我正在寻找仅使用内部函数的实现。它应该使用特殊的有理函数逼近。我需要一些几乎与cmath日志一样准确的东西,比如9-10位十进制数字,但速度更快。 最佳答案 我相信log2更容易计算。您可以将您的数字乘以/除以2的幂(非常快),使其位于(0.5,2],然后您使用Padeapproximant(取M接近N),这很容易一次又一次地得出all,

C++11 快速 constexpr 整数幂

在这里打死马。在C中进行整数幂运算的典型(且快速)方法是这种经典方法:int64_tipow(int64_tbase,intexp){int64_tresult=1;while(exp){if(exp&1)result*=base;exp>>=1;base*=base;}returnresult;}但是我需要一个编译时整数幂,所以我继续使用constexpr进行递归实现:constexprint64_tipow_(intbase,intexp){returnexp>1?ipow_(base,(exp>>1)+(exp&1))*ipow_(base,exp>>1):base;}const

c++ - 如果使用优化 (-O2, -O3),为什么这段代码的行为会有所不同?

我不得不编写一些检查例程,如果使用-O0、-O1、-O2或-O3,它们的行为似乎会有所不同。下面我创建了一个适用于-O0和-O1的最小示例。但是使用-O2或-O3行为发生了变化。在-O0和-O1的情况下,for循环递增整数,并且第一次达到最大值时,会发生溢出并触发检查例程。在另一种情况下,for循环永远不会中断,尽管整数变为负数。代码#includeinlineboolcheck(constinti){if(i为什么允许编译器优化它?尝试使用gcc、clang和icc,只有icc在所有优化变体中都正确,其他两个没有。 最佳答案 Si

c++ - 整数数组的位封装

我有一个整数数组,假设它们是int64_t类型。现在,我知道只有每个整数的前n位是有意义的(也就是说,我知道它们受到某些界限的限制)。以删除所有不必要空间的方式转换数组的最有效方法是什么(即我在a[0]处有第一个整数,在a处有第二个整数[0]+n位等等)?我希望它尽可能通用,因为n会不时变化,但我猜可能会有针对特定n的智能优化,例如2或某事的幂。当然我知道我可以迭代valueovervalue,我只是想问问你StackOverflowers是否可以想出一些更聪明的方法。编辑:这道题不是关于将数组压缩到尽可能少的空间。我只需要从每个整数中“剪切”n位并给定数组,我知道我可以安全剪切的确切