草庐IT

c++ - 为什么并行化会如此显着地降低性能?

我有一个OpenMP程序(数千行,无法在此处重现),其工作方式如下:它由工作线程和任务队列组成。一个任务由一个卷积组成;每次工作线程从工作队列中弹出一个任务时,它都会执行所需的卷积,并可选择将更多卷积插入队列。(没有特定的“主”线程;所有worker都是平等的。)当我在自己的机器(4-coreHTnon-NUMACorei7)上运行这个程序时,我得到的运行时间是:(#threads:runningtime)1:5374ms2:2830ms3:2147ms4:1723ms5:1379ms6:1281ms7:1217ms8:1179ms这是有道理的。但是,当我在NUMA48核AMDOpte

c++ - 为什么ostream_iterator需要显式声明要输出的对象类型?

在当前的C++中,ostream_iterator类的设计如下://excerptedfromthestandardC++templateclassostream_iterator{public:ostream_iterator(ostream_type&);...ostream_iterator&operator=(constT&);...};对我来说,这个设计不是最理想的。因为用户在像这样声明ostream_iterator时必须指定类型T:ostream_iteratoroi(cout);事实上,cout可以将任何类型的对象作为其参数,而不仅仅是一种类型。这是一个明显的限制。//

c++ - 继承显式构造函数 (Intel C++)

英特尔C++编译器(版本16.0.3.207Build20160415)似乎在使用using继承基类的构造函数时删除了explicit说明符。这是错误吗?structB{explicitB(int){}};structD:B{usingB::B;};Bb=1;//NotOK,fineDd=1;//NotOKwithMicrosoftC++andGCC,butOKwithIntelC++ 最佳答案 我认为标准中的适当措辞如下(n4296,12.9继承构造函数):...Theconstructorcharacteristicsofaco

c++ - 数组显式衰减为指针

显式将数组衰减为指针的最简洁和惯用的方法是什么?例如,考虑您需要能够指导SFINAE或明确说明过载的情况:templatevoidfoo(T(&x)[N]);templatevoidfoo(T*x);//intx[2]={0,1};foo(x); 最佳答案 您可以使用以下其中一项:foo(x+0);foo(+x);foo(&x[0]);//assumingoperator&hasnotbeenoverloadedforTfoo(std::addressof(x[0]));//sinceC++11

c++ - 为什么显式模板实例化存在访问检查漏洞?

这个问题在这里已经有了答案:Whydotheusualaccesscontrolcheckingappliestonamesusedtospecifyexplicitinstantiationwhenaccessedthroughtemplateparameters?(1个回答)关闭5年前。[temp.explicit]包含这样的措辞:Theusualaccesscheckingrulesdonotapplytonamesusedtospecifyexplicitinstantiations.[Note:Inparticular,thetemplateargumentsandnames

c++ - 排除使用显式构造的 std::pair 构造函数

从thisanswer开始,似乎这些构造函数:templatepair(pair&&p);templatepair(constpair&p);在需要显式转换时禁止参与重载决策。来自C++11(§20.3.2,n3290):Remark:ThisconstructorshallnotparticipateinoverloadresolutionunlessUisimplicitlyconvertibletofirst_typeandVisimplicitlyconvertibletosecond_type.一个有趣的SFINAEworkaround已被建议,但这偏离了标准的文本。如果没有

c++ - 三元允许隐式调用显式复制构造函数吗?

考虑下面的代码:#includestructA{A(){}explicitA(constA&){std::puts("copy");}};intmain(){Aa;true?a:A();return0;}据我所知,三元会尝试复制a并且应该会失败,因为复制构造函数是显式的,但是gcc可以很好地编译它并创建一个拷贝。Clang按预期吐出一个错误。这是gcc中的错误吗?我在c++17模式下使用gcc8.1和clang7.0,但我也在compilerexplorer中尝试了所有版本的gcc在c++98模式下,它们的行为都相同。 最佳答案 C

c++ - 在类定义之外定义显式特化类的成员函数

我看到一个我不理解的与模板相关的错误(编译器是VisualStudio2012)。这是代码,归结为要点://Templatedclass-generictemplateclassTest{public:voidWorksFine(){}//ComiplesandworksasexpectedatruntimevoidProblem();};//Templatedclass-expicitspecializationforT=int.templateclassTest{public:voidWorksFine(){}//Comiplesandworksasexpectedatruntim

c++ - SFINAEd-out 函数是否隐藏了从基类显式导入的重载

在遇到另一个设计问题后,我决定制作一个包装类,当且仅当基类中尚不存在可行的重载时,才能向基类的某些成员函数添加重载。基本上,这就是我想要做的:templatestructwrapper:T{usingT::foo;templateautofoo(Arg)const->std::enable_if_t::value,bool>{returnfalse;}};structbar{templateautofoo(Arg)const->bool{returntrue;}};在这个简单的例子中,wrapper添加一个重载的foo仅当来自基类的那个不可行时(我将std::enable_if简化为可

c++ - 类模板显式特化也可以声明其他东西吗?

如果这个代码无效就好了。但它在概念上是合理的,而且GCCacceptsit尽管Comeau没有:templatestructt;templatestructt{}r;//Baddeclarator!Don'tpeeonthecarpet!(编辑:上面的编译但r似乎没有声明intoanyscope,所以它基本上被忽略了。)显式特化填充了模板和类之间的一种下层区域。显式特化声明的类型一旦定义就完成了。从编译器的角度来看,它不是模板。如果它是一个参数化模板,就不可能声明一个对象。考虑§14/3:Inatemplate-declaration,explicitspecialization,or