草庐IT

c++ - 优化正在取消我在 clang 6 中的整数溢出检查

我有一些财务应用程序的定点实现。它基本上是一个包含在类中的整数,该类基于给定的小数位数N被视为十进制数。这个类很偏执,会检查溢出,但是当我在Release模式下运行我的测试时,它们失败了,最后我创建了这个演示问题的最小示例:#include#includetemplatetypenamestd::enable_if::value,T>::typeFromString(U&&str){std::stringstreamss;ss>ret;returnret;}intmain(){intNewAccu=32;intN=10;usingT=int64_t;Tl=10;Tr=FromStrin

c++ - 为什么 clang 不像 #define 那样优化全局常量?

我有这个测试程序,使用#define常量:#include#defineFOO1intmain(){printf("%d\n",FOO);return0;}当使用“AppleLLVM版本10.0.0(clang-1000.11.45.5)”编译时,我得到一个8432字节的可执行文件。这是程序集list:.section__TEXT,__text,regular,pure_instructions.build_versionmacos,10,14.globl_main##--Beginfunctionmain.p2align4,0x90_main:##@main.cfi_startpro

c++ - 在 GCC 工作正常的情况下使用 Clang 时无限递归模板实例化?

以下C++代码的目的是将三元运算符(?:)包装在一个单独的函数中,稍后将有助于构建语法树。在查看真正的C++代码片段之前,让我们快速看一下它在伪代码中的作用:boolrecursive(boolv){returnv?v:recursive(v);}intmain(){boolr=recursive(true)}不幸的是,当三元运算符(?:)包含在模板函数中时,Clang会在终止递归时遇到问题:/******************DECLARATIONS******************/templateconstexprTrecursive(Tt);structIfCase{tem

c++ - C++ 中的重载 lambda 以及 clang 和 gcc 之间的区别

我正在尝试在C++中重载lambda的技巧。具体来说://Forstd::function#include//Forstd::string#include//Forstd::cout#includetemplatestructoverload:F...{overload(F...f):F(f)...{}};templateautomake_overload(F...f){returnoverload(f...);}intmain(){std::functionf=[](intx,inty){returnx+y;};std::functiong=[](doublex,doubley){r

c++ - clang-format:如何防止下一行的所有函数参数?

我有一个C++函数调用,我手动和有意格式化为这个:DoSomethingForAPurposeThatCausesALongFunctionName(arg_0,arg_1,arg_2);clang-format想像这样重新格式化它:DoSomethingForAPurposeThatCausesALongFunctionName(arg_0,arg_1,arg_2)我不想要这个。AllowAllParametersOfDeclarationOnNextLine似乎控制函数声明的这种行为,但是函数调用呢?有相应的设置吗?我的.clang-format看起来像这样:BasedOnStyl

c++ - clang 和 gcc 之间对三元运算符的 const 引用地址的差异

我对这里发生的事情有一个模糊的想法...它与this有关但我想知道为什么clang++和g++以不同的方式处理这个问题。这里的未定义行为在哪里?注意:这与模板无关——我只是使用它们来使示例更紧凑。这都是关于whatever的类型。#include#includetemplatevoidtest(){Twhatever='c';constchara='a';std::cout();test();return0;}gcc输出(测试到4.9.3):begin:0x7fffe504201fref:0x7fffe504201fbegin:0x7fffe504201eref:0x7fffe5042

c++ - 自引用使用 unordered_map 会导致 gcc 5.3 出现问题但不会导致 clang

以下代码无法在gcc5.3下编译(它是从较大代码段中提取的缩减版本):#include#includeclassFoo{std::unordered_mapm;//"self-referential"};intmain(){Foof;return0;}有以下错误:g++--std=c++1y-crh.cppInfileincludedfrom/usr/local/include/c++/5.3.0/utility:70:0,from/usr/local/include/c++/5.3.0/unordered_map:38,fromrh.cpp:1:/usr/local/include/

c++ - GCC 和 Clang 都不会通过编译时已知的函数指针数组进行内联调用——为什么?

CompilerExplorer上的示例代码:https://godbolt.org/g/fPfw4k我曾尝试使用函数指针数组作为跳转表而不是开关,因为我发现它更简洁。然而,令我惊讶的是,GCC和Clang编译器似乎都无法内联它。是否有具体原因?包含死链接的示例代码:namespace{templateintbar(){returnN;}intfoo1(intn){if(n5){__builtin_unreachable();}#if__clang____builtin_assume(n>=0&&n,bar,bar,bar,bar,bar};returnfns[n]();}intfoo

c++ - Clang 无法在 macOS 中编译基本头文件(如 <iostream>)

我的macOS版本是10.14Xcode版本是10.2为clang编写插件。我只是使用以下命令从Github安装llvm和clang。gitclonehttps://github.com/llvm/llvm-project.gitcdllvm-projectmkdirbuildcdbuildcmake-G"UnixMakefiles"-DLLVM_ENABLE_PROJECTS="clang;libcxx;libcxxabi"../llvm然后用clang--version,它显示:clangversion10.0.0(https://github.com/llvm/llvm-proj

c++ - 这个不可复制的 map 是否合法 c++11? GCC 4.7 和 MSVS 2010 允许它。 Clang 3.1 没有

我创建了一个不可复制的map,我无法使用clang对其进行编译。由于clang非常符合标准,我想知道我的代码是否合法。MSVS2010和GCC4.7编译此代码时没有警告或错误。附上完整代码:有问题的行是main的最后一行。=delete需要删除MSVS2010#include#include#includetemplate>classnon_copyable_map:publicstd::map{typedefstd::mapBaseType;public:non_copyable_map(){}non_copyable_map(non_copyable_map&&t):BaseTyp