Tag: g ++

g ++和clang ++与积分模板参数的不同行为

我有以下C ++ 11代码。 #include <type_traits> using IntType = unsigned long long; template <IntType N> struct Int {}; template <class T> struct is_int : std::false_type {}; template <long long N> struct is_int<Int<N>> : std::true_type {}; int main() { static_assert (is_int<Int<0>>::value, ""); return 0; } Clang ++ 3.3编译代码,但在g ++ 4.8.2静态断言失败 $ g++ -std=c++11 main.cpp main.cpp: In function […]

超越-O3 / -Ofast的G ++优化

问题 我们有一个用于模拟任务的中型程序,我们需要优化。 我们已经尽我们最大的优化来源,以尽可能限制我们的编程技能,包括与Gprof和Valgrind分析。 当最后完成时,我们想在几个系统上运行该程序可能几个月。 因此,我们真的有兴趣将优化推向极限。 所有系统将在相对较新的硬件(Intel i5或i7)上运行Debian / Linux。 问题 使用g ++的最新版本的可能的优化选项是什么,超越-O3 / -Ofast? 我们也对昂贵的小规模优化感兴趣,从长远来看这将是支出。 我们现在使用什么 现在我们使用下面的g ++优化选项: -Ofast :最高“标准”优化级别。 包括-ffast-math计算在我们的计算中没有造成任何问题,所以我们决定去做,尽pipe不符合标准。 -march=native :启用所有CPU特定指令。 -flto允许在不同的编译单元中优化链接时间。

用g ++编译c ++ 14-code

我在Ubuntu 14.04 LTS上使用g ++ 4.8.4。 当试图用'-std = c ++ 14'编译时,我得到这个错误: g++: error unrecognized command line option '-std=c++14' 用'-std = c ++ 11'编译工作正常,所以我不知道发生了什么事情。 g ++真的不支持c ++ 14吗? 我使用错误的命令行选项? 我用“sudo apt-get install g ++”应该自动检索最新版本,是不是正确?

禁用g ++的返回值优化

我需要在命令行上使用哪些标志来禁用g ++编译器自动启用的返回值优化?

std :: this_thread :: sleep_for()和GCC

当我尝试编译这个简单的程序时: #include<thread> void f() { std::this_thread::sleep_for(std::chrono::seconds(3)); } int main() { std::thread t(f); t.join(); } 在Ubuntu 10.04(32位)上使用gcc 4.4.3版本: $ g++ -std=c++0x -pthread a.cpp -oa 我得到: error: 'sleep_for' is not a member of 'std::this_thread' 我看着标题“线程”。 sleep_for()被_GLIBCXX_USE_NANOSLEEP保护 #ifdef _GLIBCXX_USE_NANOSLEEP … /// sleep_for template<typename _Rep, typename _Period> inline void sleep_for(const chrono::duration<_Rep, _Period>& __rtime) … 为什么_GLIBCXX_USE_NANOSLEEP没有定义? 我如何得到这个例子来编译? 更新2012年9月17日 (jogojapan):今天我遇到了同样的问题,使用GCC 4.7.1。 […]

<cstring>和<string>之间的区别

今天早些时候(实际上昨天是由于我的时区),我正在Interview Street(使用g ++ )尝试使用Visual Studio 2012 for C ++进行编程访谈。 简而言之,我在使用时遇到了几个编译错误1 #include <cstring> 这是由骨架代码提供的一个问题,然后转向 #include <string> 所有的编译错误都神奇地消失了。 但是,在提交到采访街之后,我不得不补充c ; 否则我得到编译错误。 这是我第一次被非标准化咬伤…. 我的问题是: <string>和<cstring>把我(宝贵的)超过半小时? 1对于任何好奇的人: 如果using <cstring> ,Visual Studio 2012会出现一个错误: 错误C2338:C ++标准不提供这种types的散列。 在 c:\ program files(x86)\ microsoft visual studio 11.0 \ vc \ include \ xstddef 可能是string作为unordered_map键 如果using <string>由g ++引起的一个错误是: “strlen”没有在这个范围内声明

GCC错误与可变参数模板:“对不起,未实现:不能扩展'标识符…'到一个固定长度的参数列表”

在GCC的C ++ 11中进行可变模板编程时,偶尔会遇到一个错误,提示“对不起,未实现:无法将”标识符…“扩展为固定长度的列表。 如果我删除代码中的“…”,那么我会得到一个不同的错误:“错误:参数包不能用'…'扩展。 所以如果我有“…”,GCC会调用这个错误,如果我把“…”取出,GCC也会调用这个错误。 我已经能够处理这个问题的唯一方法是从头开始用一种不同的方法完全重写模板元程序,并且(幸运的是)我最终得到了不会导致错误的代码。 但我真的想知道我做错了什么。 尽pipe谷歌search,尽pipe进行了大量的实验,我不能确定我做了不同的模板代码之间产生这种错误,和没有错误的代码。 错误信息的措辞似乎意味着代码应该按照C ++ 11标准工作,但是GCC目前还不支持它。 或者,也许这是一个编译器错误? 这是一些产生错误的代码。 注意:我不需要你为我写一个正确的实现,而只是指出我的代码是什么导致了这个特定的错误 // Used as a container for a set of types. template <typename… Types> struct TypePack { // Given a TypePack<T1, T2, T3> and T=T4, returns TypePack<T1, T2, T3, T4> template <typename T> struct Add { typedef TypePack<Types…, T> type; }; }; […]

GNU C ++如何检查-std = c ++ 0x是否有效?

我的系统编译器(gcc42)与我想要的TR1function正常工作,但试图支持比系统更新的编译器版本,尝试访问TR1头文件#error要求-std = c ++ 0x选项,因为它是如何与图书馆或一些集线器像这样的接口。 /usr/local/lib/gcc45/include/c++/bits/c++0x_warning.h:31:2: error: #error This file requires compiler and library support for the upcoming ISO C++ standard, C++0x. This support is currently experimental, and must be enabled with the -std=c++0x or -std=gnu++0x compiler options. 提供一个额外的开关是没有问题的,在这个系统(FreeBSD)下支持GCC 4.4和4.5,但显然它改变了图片! 使用我的系统编译器(g ++ 4.2默认方言): #include <tr1/foo> using std::tr1::foo; 使用较新的(4.5)版本的编译器与-std = c ++ 0x: #include <foo> using […]

列表初始化期间临时对象的生存期

我一直认为,临时性的东西一直存在,直到一个完整的expression式结束。 然而这是一个std::vector和一个数组的初始化之间的一个奇怪的区别。 请考虑下面的代码: #include <iostream> #include <vector> struct ID{ static int cnt; // the number of living object of class ID at the moment of creation: int id; ID():id(++cnt){} ~ID(){ cnt–; } }; int ID::cnt=0; int main(){ int arr[]{ID().id, ID().id}; std::vector<int> vec{ID().id, ID().id}; std::cout<<" Array: "<<arr[0]<<", "<<arr[1]<<"\n"; std::cout<<" Vector: "<<vec[0]<<", "<<vec[1]<<"\n"; } 这个程序的输出是有点意外的(至less对我来说): Array: 1, […]

如何恢复一个信号量的过程,减less到零崩溃?

我有多个使用g ++编译的应用程序,运行在Ubuntu中。 我正在使用命名的信号来协调不同的进程。 所有工作正常, 除了在以下情况:如果其中一个进程调用sem_wait()或sem_timedwait()来减less信号量,然后死机或死亡-9之前有机会调用sem_post() ,那么从那一刻,这个指定的信号量是“不可用的”。 所谓“不可用”,我的意思是信号计数现在为零,本来应该增加到1的过程已经死亡或被杀死了。 我找不到一个sem_*() API,它可能会告诉我最后一次减less的进程崩溃。 我在哪里错过了一个API? 以下是我如何打开指定的信号量: sem_t *sem = sem_open( "/testing", O_CREAT | // create the semaphore if it does not already exist O_CLOEXEC , // close on execute S_IRWXU | // permissions: user S_IRWXG | // permissions: group S_IRWXO , // permissions: other 1 ); // initial value of […]