草庐IT

c++ - 为什么内联函数比函数指针慢?

考虑以下代码:typedefvoid(*Fn)();volatilelongsum=0;inlinevoidaccu(){sum+=4;}staticconstFnmap[4]={&accu,&accu,&accu,&accu};intmain(intargc,char**argv){staticconstlongN=10000000L;if(argc==1){for(longi=0;i当我编译它时:g++-O3test.cpp我希望第一个分支运行得更快,因为编译器可以将函数调用内联到accu。第二个分支不能内联,因为accu是通过存储在数组中的函数指针调用的。但结果让我吃惊:time

c++ - 什么时候一个模板比另一个模板更专业? 'And'/'Or' 与逻辑混淆。

在C++11草案的14.8.2.4p10中,有写Ifforeachtypebeingconsideredagiventemplateisatleastasspecializedforalltypesandmorespecializedforsomesetoftypesandtheothertemplateisnotmorespecializedforanytypesorisnotatleastasspecializedforanytypes,thenthegiventemplateismorespecializedthantheothertemplate.为什么会有“或至少不专门用于任

c++ - 几次比较怎么会比一些计算慢?

我们正在开发一段代码,用于检查何时不允许用户在一段时间内进入某个扇区,我的一位同事创建了一个函数,在下面的代码中是isAllowed并包含几个比较,我采用了不同的方法,即函数isAllowed2它使用时间段之间的秒数。一开始我们并没有怀疑他的函数会更快,但实际运行代码并比较速度时并非如此,即使差异是我们可以完全忽略的,我们想知道为什么会这样“应该”更快的那个实际上更慢。考虑以下代码:#include#includeusingnamespacestd;usingnamespacestd::chrono;structtiming{shorthour;shortminute;};boolis

c++ - C++11 中的 std::nextafter() 如何产生比 std::numeric_limits::min 更小的值?

我刚刚注意到我系统上的std::nextafter(0,1)似乎产生了一个大于0且低于std::numeric_limits::min()。这怎么可能?我认为min()返回大于0的最小可能数字。#includeintmain(intargc,char*argv[]){doublenext=std::nextafter(0.0,1.0);doublemin=std::numeric_limits::min();std::cout0:"0.0)输出:next:4.94066e-324min:2.22507e-308next0:1我的编译器是MinGW5.3.032bit。

c++ - printf 比 std::cout 快 5 倍以上?

#include#include#include#includeintmain(intargc,char*argv[]){std::clock_tstart;doubleduration;std::cout现在,这是前五次运行的时间:std::cout测试:1.125s;printf测试:0.195秒std::cout测试:1.154s;printf测试:0.230秒std::cout测试:1.142s;printf测试:0.216秒std::cout测试:1.322s;printf测试:0.221秒std::cout测试:1.108s;printf测试:0.232秒如您所见,使用pr

c++ - DLL 比静态链接慢吗?

我为游戏制作了一个GUI库。我的测试演示以60fps运行。当我使用库的静态版本运行此演示时,它在任务管理器中占用2-3%的cpu。当我使用DLL版本时,它使用了大约13-15%。这正常吗?是这样,我该如何优化它?我已经要求它使用/O2进行大部分函数内联。 最佳答案 在DLL有机会执行其功能一次之前,不要启动性能计时器。这使它有时间加载到内存中。然后启动计时器并检查性能。然后它应该基本上匹配静态库。还要记住,DLL的加载位置会极大地影响它的加载速度。DLL的默认基地址是0x400000。如果您在该位置已经有其他DLL,则加载过程必须执

c++ - boost::dynamic_bitset 比 std::bitset 慢,除非 std::bitset 被重置

我最近遇到了bitset模板,我真的很想在我当前的项目中使用它们。继续阅读,我看到std::bitset模板的大小必须在编译时确定。许多人建议使用boost::dynamic_bitset来缓解这个要求。为了比较两者,我决定对set、flip和count方法进行速度比较。结果很奇怪......我想知道是否有人可以为我解释一下。代码在帖子的末尾,但我会在这里解释我在做什么。我有一个std::bitset对象(称为bs)和一个boost::dynamic_bitset对象(称为dynbs)。每个都有n=1000000位。对于上面的给定方法,依次调用每个n位的方法并重复此R=10000次。使

c++ - 比 if else if else... 更好的方法用于线性插值

问题很简单。假设你有功能doubleinterpolate(doublex);并且你有一张表,其中包含已知x->y的map例如5157月18日1022注意:真正的表更大,这只是示例。所以对于8,您将返回18+((8-7)/(10-7))*(22-18)=19.3333333我发现的一个很酷的方法是http://www.bnikolic.co.uk/blog/cpp-map-interp.html(长话短说,它使用std::map,key=x,value=y表示x->y数据对)。如果有人问标题中的ifelseifelse是什么意思基本上是:if((x>=5)&&(x=7)&&x那么有没有

c++ - RAII 什么时候比 GC 更有优势?

考虑这个在C++中演示RAII的简单类(从我的脑海中):classX{public:X(){fp=fopen("whatever","r");if(fp==NULL)throwsome_exception();}~X(){if(fclose(fp)!=0){//Anerror.Nowwhat?}}private:FILE*fp;X(Xconst&)=delete;X(X&&)=delete;X&operator=(Xconst&)=delete;X&operator=(X&&)=delete;}我不能在析构函数中抛出异常。我有一个错误,但没有办法报告它。这个例子非常通用:我不仅可以使用

c++ - `void f(A<0>, tuple<T *...>)` 不是比 `void f(A<I>, tuple<T *...>)` 更专业吗?

#includetemplatestructA{};templatevoidf(A,std::tuple){}templatevoidf(A,std::tuple){}intmain(){f(A{},std::tuple{});}不是f的第二次重载吗?更专业?g++4.9.2表示调用不明确,clang3.6.0接受它。哪个编译器是对的?有趣的是,如果您更改std::tuple至std::tuple,g++就可以了,这个我没看懂。 最佳答案 根据当前规则,第二个重载更加特化。一些专业A具有合成值@无法与A匹配,但是A可以匹配A(与I=