草庐IT

评估器

全部标签

c++ - 概念评估能否取决于评估的位置?

[temp.concept]/5说:Aconceptisnotinstantiated([temp.spec]).[ Note:Anid-expressionthatdenotesaconceptspecializationisevaluatedasanexpression([expr.prim.id]).[...]]这是否意味着下面的这条规则([temp.point]/8)不适用?Iftwodifferentpointsofinstantiationgiveatemplatespecializationdifferentmeaningsaccordingtotheone-defini

c++ - requires 的主体是否会阻止未评估的上下文?

概念的主体是定义还是需要block未评估的上下文?例如。我可以安全地使用std::declval吗?templateconceptboolSomeConcept=requires(Ta){{a.someFunction(std::declval())}->int;}; 最佳答案 是的。来自[temp.constr.expr],措辞截至N4641:AnexpressionconstraintisaconstraintthatspecifiesarequirementontheformationofanexpressionEthroug

c++ - 无法评估函数——可能是内联的

我写了一个类似这样的函数:classabc{private:intm_var;public:intfunc(){returnm_var;}};当我尝试使用gdb中的abc对象指针打印func()时,它给出了错误:**无法评估函数——可能被内联**如何打印内联函数的值? 最佳答案 你得到这个错误是因为你把func的定义放在类体中并且它足够小,所以,首先,编译器内联这个函数----这意味着,编译将用它的这个函数调用的所有外观替换定义,并且该函数的定义不会在可执行文件中。其次,你并没有真正在你的程序中调用那个函数,所以事实上,这个函数永远

c++ - 跟踪 C++ 中的内存使用情况并评估内存消耗

我的代码遇到了以下问题:我使用Valgrind和gperftools来执行堆检查和堆分析以查看是否释放了我分配的所有内存。这些工具的输出看起来不错,似乎我并没有失去内存。但是,当我查看top和ps的输出时,我感到很困惑,因为这基本上不代表我使用valgrind和gperftools观察到的内容。这里是数字:热门报告:RES150MValgrind(Massif)报告:23M峰值使用量gperftoolsHeapProfiler报告:22.7M峰值使用率我现在的问题是,差异从何而来?我也尝试跟踪Valgrind中的堆栈使用情况,但没有任何成功。更多细节:该过程基本上是通过Capi将数据从

c++ - 按位或保证评估顺序?

假设我有这个代码:unsignedintfunc1();unsignedintfunc2();unsignedintfunc3();unsignedintx=func1()|func2()|func3();C++是否保证先调用func1(),然后调用func2(),再调用func3()?或者编译器是否允许以任何感觉的顺序调用函数?另外,如果编译器愿意,是否允许在这里实现短路优化?(例如,如果func1()返回~0,编译器是否可以决定不打扰调用func2()或func3(),因为它知道它们的返回值不可能影响分配给x的值?) 最佳答案

c++ - std::optional::value_or() - 惰性参数评估

是否有可能以惰性方式评估std::optional::value_or(expr)参数,因此expr仅在没有的情况下计算值(value)?如果不是,什么是合适的替代品? 最佳答案 #includetemplatestructLazy{Ff;operatordecltype(f())()const{returnf();}};templateLazy(Ff)->Lazy;intmain(){std::optionalo;inti=o.value_or(Lazy{[]{return0;}});}DEMO

c++ - 评估一个数是否是 4 的整数幂

声称下面的函数是用来判断一个数是否是4的整数次幂。我不太明白它是怎么工作的?boolfn(unsignedintx){if(x==0)returnfalse;if(x&(x-1))returnfalse;returnx&0x55555555;} 最佳答案 第一个条件排除0,这显然不是4的幂,但会错误地通过以下两个测试。(编辑:不,它不会,正如所指出的那样。第一个测试是多余的。)下一个是一个不错的技巧:当且仅当数字是2的幂时,它才返回true。2的幂的特征是只设置一个位。设置了一位的数字减去1会导致该数字之前的所有位都被设置(即0x1

c++ - 是否应该评估或存储循环限制?

在C++中,将循环的限制存储在变量中是否比计算值更快?例如:是不是使用起来比较慢for(inti=0;i比做以下?for(inti=0,limit=n*n+2*n;i为清楚起见,假设n是某个在循环过程中保持不变的给定变量。 最佳答案 如果n是一个全局声明的非volatile变量,然后是行为for(inti=0;i未指定。允许编译器优化n*n+2*n即使另一个线程修改n也会被评估一次.此外,如果另一个线程能够修改n,那么您应该采取措施避免同时读取和写入n的可能性(其行为是未定义)。考虑使用std::atomic作为n的类型.所以真的很

c++ - 为什么按此顺序评估 '--++a-​-++ +b--'?

为什么下面打印的是bDaDaBaAaCaU而不是aDaBaAaCbDaU?换句话说,为什么b--在--++a--++之前被评估?#includeusingnamespacestd;classA{charc_;public:A(charc):c_(c){}A&operator++(){cout据我所知,编译器解析表达式的方式如下:预处理器标记化:--++a--+++b--;运算符优先级1:(--(++((a--)++)))+(b--);+是从左到右关联的,但编译器可能会选择先计算右侧的表达式(b--)。我假设编译器选择这样做是因为它会导致更好的优化代码(更少的指令)。但是,值得注意的是,

c++ - 是否可以强制 STL 集重新评估谓词?

考虑以下数据结构和代码。structSentence{std::stringwords;intfrequency;Sentence(std::stringwords,intfrequency):words(words),frequency(frequency){}};structSentencePCompare{booloperator()(constSentence*lhs,constSentence*rhs)const{if(lhs->frequency!=rhs->frequency){returnlhs->frequency>rhs->frequency;}returnlhs-