草庐IT

c++ - 为什么 clang 会使我的简单阶乘函数过于复杂?

考虑一个简单的阶乘函数:staticintfactorial(intn){if(n用-O2编译会产生一个非常有趣的区别:g++7.3:我使用10条指令将几乎相同的循环结构转换为汇编。clang++5.0.0:我收到了220多条指令的一大堆乱七八糟的东西,我不知道发生了什么。Seethecomparisonhere(Compilerexplorer)在本地构建并比较运行时,简单的g++二进制文件在Ubuntu17.10上的所有合理值(即不会导致溢出)的运行速度肯定更快。谁能告诉我为什么clang会带来所有这些麻烦,它试图做什么(并且在大小和速度上都失败了)?

java - clang/libclang 有 Java 绑定(bind)吗?

我想在基于Java的IDE的插件中使用clang的代码分析功能。由于插件必须用Java编写,我想知道是否有任何libclang的Java绑定(bind),或从Java程序访问clang功能的其他方法(除了直接使用JNI之外)? 最佳答案 我正在密切跟踪LLVM/Clang开发,我不知道Java绑定(bind)到libclang。 关于java-clang/libclang有Java绑定(bind)吗?,我们在StackOverflow上找到一个类似的问题: h

c++ - 默认参数和参数包之间的交互(GCC 和 clang 不同意)

我希望编译以下代码:#includetemplatevoidprint(Tval=T{},Args...args){std::cout虽然它在GCC5.2(C++11)上编译,尽管有unused-but-set-parameter警告,但clang3.6(C++11)给出了以下错误消息:main.cpp:4:33:error:missingdefaultargumentonparameter'args'voidprint(Tval=T{},Args...args){^main.cpp:11:5:note:ininstantiationoffunctiontemplatespeciali

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++ - 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