gcc编译选项[C++]

上一篇博客还是在去年12月份,之后参加了ICRA2019大疆主办的人工智能挑战赛,比赛要做技术方案,又要办理加拿大签证,中间大概忙了三个月的时间,最近刚把最后一次技术报告提交,等待最终的参赛通知,所以把最近一段时间的新的总结一下,ICRA比赛相关的东西我会在赛后总结一下,发布在”ICRA2019”分类下。

GCC下C++的编译选项

为什么会总结一下这个呢?是因为最近在做boost及SSE、AVX指令集优化时,遇到过没有加编译选项的问题,报了一些错误,所以今天先把这个总结一下。

参考文档

  • -Wreorder 当代码中给出的成员初始化的顺序与它们必须执行的顺序不匹配时发出警告
    1
    2
    3
    4
    5
    struct A { 
    int i; 
    int j; 
    A()j(0),i(0){} //会发出警告
    };
    
  • -fconstexpr-depth=n 将C ++ 11 constexpr函数的最大嵌套深度设置为n,标准规定的最小值为512。
  • -Wunknown-pragmas 当出现无法识别的#pragma 预定义符号时,警告。我印象中只在使openMP时候用过这个预编译指令
  • -Wunused 启用所有的“未使用”警告,比如某某变量只定义了没有使用,某某函数只定义了没有使用。
  • -fimplicit-templates 允许模板隐式实例化
  • -fmudflapth 开启多线程检查mudflap边界
  • -fopenmp 开启openMP
  • -fshort-double 将double的字节数规定为和float一样
  • -fdelete-null-pointer-checks 删除无用的空指针检查
  • -funsafe-math-optimizations and -funsafe-loop-optimizations 开启有风险的计算和循环优化
  • -fexpensive-optimizations 一些代价比较大的优化,具体不详
  • -foptimize-sibling-calls 对sibling call,tail recursive call进行优化。
  • -fno-defer-pop 函数返回的时候,就立即将栈里面放置的该函数的参数pop出来。这样可以避免函数参数占用过多的栈空间。
  • -mmmx 支持MMX内建函数
  • msse 支持 MMX 和 SSE 内建函数及代码生成
  • -msse2 支持 MMX、SSE 和 SSE2内建函数及代码生成
  • msse3 支持 MMX、SSE、SSE2 和 SSE3内建函数及代码生成
  • -msse4 支持 MMX、SSE、SSE2、SSE3、SSSE3、SSE4.1和 SSE4.2 内建函数及代码生成
  • mavx and -mavx2 MMX、SSE、SSE2、SSE3、SSSE3、SSE4.1、SSE4.2和 AVX 内建函数及代码生成,可以看出内建函数的支持是向前兼容的,兼容顺序为指令集的诞生时间。
  • -msse-check=[none|error|warning] 检查SSE内联函数语法

之前还遇到过网上流传的40行暴力编译优化,比较玄学,新手慎用,一般最简单的方法是开启-O3优化即可,还是把精力放在算法优化、指令集优化及多线程计算上实用点。