草庐IT

llvm-gcc

全部标签

c++ - 除非返回值有名称,否则为什么 GCC 无法优化?

考虑这段代码:#includeclassC{std::arraya{};intb{};};Cslow(){return{};}Cfast(){Cc;returnc;}GCC6到9为slow()生成非常臃肿的代码:slow():xoreax,eaxmovDWORDPTR[rsp-25],0movBYTEPTR[rsp-21],0movedx,DWORDPTR[rsp-24]movDWORDPTR[rsp-32],0movWORDPTR[rsp-28],axmovBYTEPTR[rsp-26],0movrax,QWORDPTR[rsp-32]retfast():xoreax,eaxxore

c++ - constexpr 返回数组,gcc 警告

我编写了一个返回数组的constexpr函数。#includeconstexprautoget_str(void)->constchar(&)[4]{return{'T','E','S','T'};}constexprintsum(constchar(&str)[4]){returnstr[0]+str[1]+str[2]+str[3];}intmain(void){constexprints=sum(get_str());std::coutg++4.8正确编译代码,但发出以下警告:test.cpp:Infunction‘constexprconstchar(&get_str())[4

c++ - gcc-4.9.2 : non-type template parameter

我在gcc-4.9.2上有一个奇怪的编译错误,相同的代码在其他编译器上工作,比如gcc-4.8或我能找到的任何clang。问题与non-typetemplate-arguments有关.所以考虑一下:#include#includeinttemplateParam;templatestructTestTemplate{intvalue(){}};templateintTestTemplate::value(){returntemplateParam;}TestTemplatetestVariable;intmain(){std::cout我在gcc-4.9.2中遇到以下错误:prog.

c++ - 如何使用 LLVM 在 Windows 上为 ARM 编译 C++ 程序?

目标仅使用LLVM在Windows上为ARM编译C++程序。为什么LLVM因为许可许可。我开始怀疑我对LLVM的理解是否正确。在主机上做使用clang(前端)生成中间表示。此表示与目标无关。使用llc(后端)生成目标汇编代码。使用lld-link.exe生成可执行文件。然后在目标机器上执行。主机Windows10,64位目标机用armcortex-a57驱动PX程序intmain(intargc,char*argv[]){intx=41;x++;returnx;}我已经检查并编译了LLVM(使用VisualStudio2015,发布版本,CPU=x64)我的尝试clang.exe-ta

c++ - 是否有等效于 Clang/LLVM 的 .spec 文件,我在哪里可以找到引用?

可以使用.specs文件将gcc驱动程序配置为使用特定链接器、特定选项和其他详细信息(例如覆盖系统header)。GCC(4.9.0)版本的当前(截至撰写本文时)手册describestheSpecFileshere.Clang/LLVM有没有类似的机制。显然Clang有thenotionofadriver同样,但我无法提供任何关于Clang是否存在规范文件或类似机制以及如何使用它们的文档。我对C和C++都感兴趣,但可能指向它们中的任何一个的指针都会让我开始。目标是覆盖系统头文件和库路径以及之前简要提到的链接器。 最佳答案 根据th

c++ - GCC:如何找到不丢弃目标文件的原因

我有一个可执行文件,它链接到一个包含大量函数的大型.a存档。可执行文件只使用了这个存档中的一小部分功能,但出于某种原因,它从中提取了所有内容,最终变得非常大。我怀疑可执行文件正在使用的某些功能以某种方式引用了它不应该引用的内容,这会导致其他所有内容都被拉出。是否可以让gcc告诉我是什么引用导致在可执行文件中添加特定符号?为什么还会发生这种情况?我试过使用--gc-sections但没有效果。我试过使用--version-script使可执行文件中的所有符号都在本地无效我对-ffunction-sections和-fdata-sections不感兴趣,因为我想丢弃的是对象文件,而不是函数

c++ - 将 std::vector 作为模板模板参数传递时出错 - 在 GCC 中有效,在 MSVC 中失败

下面的代码#include#include#include#include#include#include#defineBEGIN_TO_END(container)container.begin(),container.end()templateclassOutputContainerType,classInContainer>OutputContainerTypeconvertContainer(constInContainer&in){OutputContainerTyperesult;std::transform(BEGIN_TO_END(in),std::back_inser

c++ - gcc 的 asm volatile 是否等同于递归的 gfortran 默认设置?

我只是在研究C++和Fortran中的递归函数,我意识到Fortran中的一个简单递归函数几乎是与其等效的C++函数一样快。现在,在进入这个之前,我知道这里有类似的问题,特别是:Whydoesaddingassemblycommentscausesuchradicalchangeingeneratedcode?Workingofasmvolatile(“”:::“memory”)Equivalenttoasmvolatileingfortran但是,我有一点更具体和困惑,因为Fortran编译器似乎正在做你可以用gcc中的asmvolatile实现的事情。为了给您一些上下文,让我们考虑

c++ - clang 中明确指定的参数无效,但在 gcc 中编译成功——谁错了?

以下代码在g++中编译没有问题:#include#include#includetemplatevoidtest(constT&value){std::tuplex;std::cout(x);}intmain(){test(std::integral_constant());}我使用了这个命令:g++test.cpp-otest-std=c++14-pedantic-Wall-Wextra但是,当我将g++切换到clang++(使用g++5.1.0和clang++3.6.0)时,出现以下错误:test.cpp:9:18:error:nomatchingfunctionforcallto

c++ - 为什么 libcxx 应用 __forceinline 或 GCC 等效于它已经隐藏的内联函数?

我想确切地理解为什么内联函数的libc++可见性宏使用__forceinline或__attribute__((__always_inline__))作为它关联的属性的一部分内联函数。背景见:ThelibcxxvisibilitydesigndocumentThedefinitionofINLINE_VISIBILITY如果这些内联函数无论如何都将被标记为__visibility__("hidden"),为什么还需要额外强制编译器将它们内联?我想了一下,我有一些假设,但似乎没有一个让我完全满意:这是为了确保符号不会意外成为ABI的一部分。如果在构建库时,编译器选择不内联函数,它可能会成