我正在尝试做类似于anotherquestion的事情,即有条件地在我的程序中包含OpenMP编译指示。但是,我想更进一步,避免用户每次使用pragma时都需要指定omp。换句话说,我希望编译以下代码:#include#include#ifdef_OPENMP#defineLIB_PRAGMA_OMP(x)_Pragma("omp"#x)#else#defineLIB_PRAGMA_OMP(x)#endifintmain(){LIB_PRAGMA_OMP(parallel){std::printf("Hellofromthread%d\n",omp_get_thread_num());
如果我不将函数f声明为内联。如下:嗯:Xf(Yy);A.cpp:Xf(Yy){...}然后在不同的翻译单元中:B.cpp:#include"A.h"Zg(Ww){......f(...)......}然后我用gcc4.6编译A.o和B.o这两个翻译单元,然后也通过gcc链接它们。(也许对两个步骤都使用-O3)gcc会考虑在链接时内联函数以提高性能吗?还是为时已晚?在一次代码审查中,有人建议我不应该将我的函数声明为内联,因为编译器比我更了解何时内联。我一直觉得除非函数在header中定义,否则编译器没有内联它的选项。(如果C模式、C++模式或gnu++0x模式的答案不同,请同时指出)
下面的代码使用一种非常直接的方法来计算矩阵乘积a*b并将结果存储在c中。该代码是在GCC4.4.6(使用-mtune=native)和英特尔编译器13.0.1上使用-O3编译的,GCC的速度明显更差(超过所用样本数据的两倍)。我很好奇造成这些差异的原因,但不幸的是,我对汇编输出不够熟悉,无法理解这里发生了什么。乍一看,似乎ICC在矢量化计算方面做得更好,但我无法破译更多。(这主要用于学习目的,因为我无法在生产中使用它!)void__attribute__((noinline))mm(//Line3intn,double*__restrict__c,double*__restrict__
这是我的代码#includestaticconstunsignedlonglongintxx=(36*36*36*36)*(36*36*36*36);staticconstunsignedlonglonginty=36*36*36*36;staticconstunsignedlonglongintyy=y*y;intmain(){std::cout这是编译输出#g++-std=c++11test.cpp-otesttest.cpp:2:62:warning:integeroverflowinexpression[-Woverflow]staticconstunsignedlonglon
考虑下面的例子g++a.ob.oc.o-oprog如果c.o没有为prog提供任何可执行代码,也没有任何对c.o的依赖其他文件,GCC是否会将c.o的内容包含在prog中?换句话说,除了编译时间之外,将不必要的文件编译成可执行文件会有什么(如果有的话)负面后果?提前致谢;干杯! 最佳答案 除了您的可执行文件可能过大之外,没有任何负面影响。链接器可能会为您删除未使用的代码,这会将事情缩减。您可以在输出可执行文件上使用某种对象查看工具(otool、objdump、nm等)来查看您的程序是否具有里面有额外的符号。我使用的是Mac,所以如果
每当我在启用优化的情况下编译C或C++代码时,dGCC都会将函数对齐到16字节边界(在IA-32上)。如果函数短于16个字节,GCC会用一些字节填充它,这些字节似乎根本不是随机的:19:c3ret1a:8db600000000lea0x0(%esi),%esi它似乎总是8db600000000...或8d742600。函数填充字节有什么意义吗? 最佳答案 填充是由汇编程序创建的,而不是由gcc创建的。它只看到一个.align指令(或等效指令),并不知道要填充的空间是在函数内部(例如循环对齐)还是函数之间,因此它必须插入NOP某种形式
假设您有以下简单的main.cpp文件:#include#include#includeusingnamespacestd;intmain(){conststringFILENAME="foo.txt";ifstreamsomefile(FILENAME);populations.close();return0;}这可以通过VisualStudioC++2010正常编译。但是,在基于Linux的系统上,如果我执行makemain并编译,我们会得到一个预期的错误,因为我们没有调用c_str()字符串常量,像这样:ifstreamsomefile(FILENAME.c_str());众所周
根据GCC'sowndocumentationonvariableattributes,声明未使用属性的正确语法是__attribute__((unused))。但是,在许多示例和其他在线代码中,我经常看到__attribute__((__unused__)),它们似乎都有效。在这两种情况下,是否有指定或省略__的原因?它有什么区别吗,是否有首选版本?是否存在使用其中一种而不使用另一种可能会导致问题的情况?想必这同样适用于其他属性参数吗? 最佳答案 在theverypageyoulinked的顶部,它告诉你:Youmayalsosp
下面的代码显示了一个带有非平凡默认构造函数的类union类(成员y是用brace-or-equal-initializer初始化的),所以如果默认了此类类的默认构造函数,则应根据§12.1/5第一个要点将其删除。也就是说,声明Tt;不应编译,因为unionT没有默认构造函数。但是codecompilesandexecutes在clang和GCC中。#includeunionT{inty{1};floatx;charc;T()=default;};intmain(){Tt;std::cout编辑我上面的问题从一开始就错了,因为unionT不是类union类。我刚刚了解到C++11中的§9
使用libc++的Clang3.8.1编译以下程序:#include#include#include#include#includeintmain(){conststd::vectorv{1,2,3};constautorange=boost::make_iterator_range(v);std::copy(std::crbegin(range),std::crend(range),std::ostream_iterator{std::cout,""});std::cout但是带有libstdc++的gcc6.1.0没有。gcc错误的第一行是:error:nomatchingfunc