草庐IT

gcc-plugin

全部标签

c++ - free() 在传递由 posix_memalign() 创建的有效指针时挂起 - gcc 和 C++11

我需要分配16字节对齐的内存,据我所知,可接受的方法是posix_memalign(),使用manpage作为引用(其他StackOverflow问题表明是这样)。下面的代码被简化以排除不相关的部分(即其他平台),但我保留了一些上下文(sse只是一个命名空间):#include#includefloat*sse::alloc(unsignedintcount){void*p;intr=posix_memalign(&p,16,sizeof(float)*count);if(r==0)return(float*)p;/*elseoutputerrorandexit(1)-hasnever

c++ - gcc/g++ 可以在忽略我的寄存器时告诉我吗?

用gcc/g++编译C/C++代码时,如果忽略了我的寄存器,能告诉我吗?例如,在这段代码中intmain(){registerintj;intk;for(k=0;kj将用作寄存器,但在此代码中intmain(){registerintj;intk;for(k=0;kj将是一个普通变量。它能告诉我我使用寄存器的变量是否真的存储在CPU寄存器中吗? 最佳答案 您完全可以假设GCC会忽略register关键字,除了-O0。但是,它不应该以任何方式产生影响,如果您深入了解,您应该已经在阅读汇编代码了。这是关于此主题的信息线程:http://

c++ - GCC 的 std::sort 与 lambda 的不稳定行为

以下代码在使用GCC6.1.0编译时会生成段错误。奇怪的是,错误是一致的,但不会发生在较小的尺寸或略有不同的比较表达式上。你们知道为什么吗?#include#include#includeintmain(){intn=1000;std::vector>vec;for(inti=0;i((7*i)%3,(3*i)%5));}std::sort(vec.begin(),vec.end(),[](std::pairconst&p1,std::pairconst&p2){return(p1.first 最佳答案 尝试改变(p1.second

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 和 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 7、libstdc++ 和 -fgnu-tm 编译时,std::is_function 无法识别 transaction_safe 函数?

下面的编译失败是由于libstdc++缺陷造成的,还是此行为符合事务内存TS(n4514)?#includestatic_assert(std::is_function_v,"");intmain(){} 最佳答案 它应该可以工作,请提交一份GCC错误报告。 关于c++-为什么在使用GCC7、libstdc++和-fgnu-tm编译时,std::is_function无法识别transaction_safe函数?,我们在StackOverflow上找到一个类似的问题:

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++ - 使用 LLVM-gcc 或 gcc 进行部分评估/特化

我对c/c++的(部分)编译时评估很感兴趣(不像c++中那样使用模板参数)。让我们考虑以下情况(取自[1]):doublemypower(doublex,intn){inti;doubleret=x;for(i=1;i然后你在代码的某处调用这个函数:mypower(x,3);//yvariesallthetime,然后编译器可以对此进行优化(例如循环展开)。我使用的一些常用功能确实可以从该优化中受益(通过手动创建专用功能进行测试)。演示文稿[1]描述了一个过程,在该过程中搜索函数并将其替换为函数的专门版本。这似乎有效。但是好像不是很通用,需要替换的功能需要自己写代码。该演示文稿似乎是从