草庐IT

clang-omp

全部标签

c++ - __has_trivial_copy 在 clang 和 gcc 中的行为不同。谁是对的?

std::is_trivially_copyable在这两个编译器中仍然不被支持(至少gcc4.6是这样)。但是两者都提供了做得很好的__has_trivial_copy指令。除非涉及到已删除的复制构造函数。structA{A(Aconst&)=delete;};__has_trivial_copy(A)在clang中返回1,在gcc中返回0。我正在研究标准,但找不到说明删除复制构造函数时类是否仍被视为可平凡复制的条款。谁是对的?我倾向于相信gcc是正确的,因为structA根本不可复制,更不用说可复制了。此外,有一个广泛的共识,即删除的复制构造函数可以被视为私有(private)声明

c++ - gcc/clang 在基本结构的后填充中布置派生结构的字段

这个问题在这里已经有了答案:Standard-layoutandtailpadding(5个答案)关闭3年前。当涉及填充和继承时,我对gcc和clang如何布局结构感到困惑。这是一个示例程序:#include#includestructA{void*m_a;};structB:A{void*m_b1;charm_b2;};structB2{void*m_a;void*m_b1;charm_b2;};structC:B{shortm_c;};structC2:B2{shortm_c;};intmain(){Cc;memset(&c,0,sizeof(C));memset((B*)&c,-

c++ - clang 左/右 3.6 倍表达式

我正在尝试使用clang3.6'--std=c++1z'的折叠表达式,但我不太明白。我正在测试的功能是:autominus=[](auto...args){return(args-...);};...std::cout根据n4191,我期待它扩展为左折叠到(10-3)-2给出结果5,然而,结果是9,这似乎是一个正确的折叠展开,即10-(3-2)我是否遗漏了什么或误解了n4191?谢谢 最佳答案 n4191由n4295修订.据此,(eop...)形式的表达式是一个一元右折叠,它被扩展为:E1op(...op(EN-1opEN)),即作

c++ - OMP部分中的线程数

我的电脑有四个核心。我正在运行Ubuntu15.10,并使用g++-fopenmp进行编译...我有两种不同类型的工作,并且两者是相互独立的:Work1和Work2。特别是,Work1应该在单个处理器上运行,但是Work2应该并行化。我尝试使用omp_set_num_threads():#pragmaompparallelsections{#pragmaompsection{//Shouldrunononeprocessor.omp_set_num_threads(1);Work1();}#pragmaompsection{//Shouldrunonasmanyprocessorsas

c++ - Clang 模块与 std <iterator> 和 <boost/move/iterator.hpp> 交互

(有关我正在使用的特定版本的Boost和Clang的信息,请参阅问题结尾)使用新的实验性-fmodules从master/HEAD在Clang中编译功能,使用如下所示的命令行选项编译以下文件时出现构建错误:#include#include编译命令及错误:anhall@leviathan:/bin/clang++-ofile.o-cfile.cpp--std=c++1z-stdlib=libc++-fmodulesInfileincludedfromfile.cpp:2:Infileincludedfrom/usr/local/include/boost/move/iterator.hp

c++ - 您如何向 clang 添加一个新关键字,一个将被视为主要关键字的关键字?

如何将新关键字添加到clang中?new关键字应该是函数限定符。声明部分去哪里?谢谢。 最佳答案 你必须将它添加到include/clang/Basic/TokenKinds.def,然后将一个新的case添加到ParseDeclarationSpecifiers(...)。可能更简单的选择是定义一个新属性,然后使用#defineyour_new_qualifier__attribute__((your_new_attribute))否则,您必须将此限定符支持添加到AST,这可能容易出错,而属性会自动传播到同一函数的各种声明中。

c++ - 我的 LLVM 和 clang (OSX) 版本是什么?

在MacOS上,如果我运行clang--version,我得到:AppleLLVMversion6.0(clang-600.0.34.4)(basedonLLVM3.5svn)Target:x86_64-apple-darwin14.0.0Threadmodel:posix自LLVMofficialpage建议当前的LLVM版本是3.5,似乎Appleclang版本控制与开源LLVM不同。输出(basedonLLVM3.5svn)表明我的机器上可能也是3.5。现在我到了这里,因为我想使用g++-std=c++14main.cc编译一个C++14文件。Thispage建议此选项适用于cl

c++ - 为什么这个基本线程程序会因 Clang 而失败,但会通过 g++?

我有一个使用线程的简单程序。在Clang中,我遇到了一堆令人困惑的无关错误。这是程序:#include#include#includeintmain(){std::packaged_tasktask([]{return1;});std::futureresult=task.get_future();task();std::cout错误:error:nomatchingconstructorforinitializationof'duration'(aka'std::chrono::duration>'):_d(_t.time_since_epoch())note:ininstantia

c++ - 没有相应编译器标志的 Clang/GCC 编译器内部函数

我知道有类似的问题,但是用不同的标志编译不同的文件是不可接受的解决方案,因为它会很快使代码库复杂化。回答“不,不可能”即可。是否可以在任何版本的Clang或GCC中为SSE2/3/3S/4.1编译内在函数,同时只允许编译器使用SSE指令集进行优化?编辑:例如,我希望编译器将_mm_load_si128()转换为movdqa,但编译器绝不能发出此指令除了这个内部函数之外的其他地方,类似于MSVC编译器的工作方式。EDIT2:我有动态调度程序和几个版本的单一功能,具有使用内部函数编写的不同指令集。使用多个文件会使维护变得更加困难,因为相同版本的代码将跨越多个文件,并且有很多此类函数。EDI

c++ - clang 和 gcc 中的 Constexpr 复合赋值运算符

我有以下代码:main.cpp#include#includeenumclassFooEnum:uint8_t{Foo1=0,Foo2=1};constexpruint32_t&operator|=(uint32_t&lhs,FooEnumrhs){returnlhs|=1u(rhs);}intmain(){uint32_tbar{0};bar|=FooEnum::Foo1;}所以本质上,|=运算符应该采用枚举并设置位,其位置对应于它的整数值。当在fedora21上用clang++3.5.0编译时,一切正常,但是当用g++4.9.2编译时,它抛出一个错误,说这不是一个常量表达式:mai