首页 > 编程语言 >用于提速的一些C++ 编译器的编译选项

用于提速的一些C++ 编译器的编译选项

时间:2023-06-18 09:00:50浏览次数:44  
标签:标志 代码 C++ 编译 编译器 优化 CPU

C++ Compiler flags


在TIO中怎么用?

在C++ Compiler flags
新建几行:

  • -Ofast:这个编译器优化选项启用所有 -O3 级别的优化,并进一步启用一些可能会破坏标准精度的优化,如忽视 IEEE 或 ISO 规定的某些数学准则的优化。这可能会使得程序运行得更快,但也可能会降低精度,因此只有在你可以接受这种精度损失的情况下才应使用。
  • -O3:这是一个编译器优化选项。这个标志告诉编译器使用所有的优化技术,包括循环展开,函数内联等等。它可能会增加编译时间和生成的代码大小,但通常会使程序运行得更快。
  • -march=native:这个标志告诉编译器生成适合本地机器架构的代码。编译器将尝试检测你的CPU类型,并启用适应的优化。这样生成的代码可能无法在其他类型的CPU上运行。
  • -mtune=native:这个标志告诉编译器优化生成的代码以适应本地机器的CPU类型,但生成的代码仍然可以在其他CPU上运行。
  • -pthread:这个标志告诉编译器包括对多线程的支持。如果你的程序使用了pthread库(例如你的代码中有#include <pthread.h>),你需要使用这个标志。
  • -ftree-vectorize:这个标志告诉编译器尝试使用SIMD指令进行向量化优化。向量化可以使CPU一次处理多个数据,从而提高运算效率。
  • -lgmp:这个标志告诉链接器链接GMP库。GMP是一个用于任意精度数学计算的库,如果你的代码中使用了GMP(例如你的代码中有#include <gmp.h>),你需要使用这个标志。
  • -lrt:这个标志告诉链接器链接实时库(real-time library)。实时库包含了一些系统级的实时函数,如clock_gettimetimer_create等。

有哪些

这些都是 C++ 编译器(特别是 GCC 和 Clang)的命令行选项。具体来说:

-march=native:这个标志告诉编译器生成的代码应该针对当前机器的 CPU 类型进行优化。"native" 表示编译器会自动探测当前 CPU 支持的所有指令集并进行优化。

-mtune=native:这个标志告诉编译器应该优化代码以最好地利用当前机器的 CPU。而不仅仅是针对特定类型的 CPU 优化。"native" 同样表示编译器会自动探测当前 CPU 的特性。

-DN=100:这个标志用来定义一个预处理器宏。在这个例子中,它定义了一个名为 "N" 的宏,值为 100。这就相当于在你的代码中加入了一行 #define N 100。这对于需要在编译时确定的参数非常有用。

这些标志使你可以更好地控制你的代码如何编译和优化,但也需要更多的知识和理解才能正确使用。

Certainly! Here are some more examples of commonly used C++ compiler flags:

-O0, -O1, -O2, -O3, -Os: 这些标志用于控制代码优化级别。-O0 表示不进行优化,而 -O1、-O2、-O3 和 -Os 表示递增的优化级别,其中 -O3 是最高级别的优化。较高的优化级别可能会产生更高效的代码,但也可能导致编译时间增加。

-lgmp: 这个标志用于链接 GMP(GNU Multiple Precision Arithmetic Library,GNU 多精度算术库)。GMP 是一个用于进行大整数运算、浮点数运算和有理数运算的库,提供了高精度计算的支持。使用 -lgmp 标志告诉编译器在链接时将 GMP 库与你的代码一起链接,以便在代码中使用 GMP 提供的函数和数据类型。

-lpthread: 这个标志用于链接 POSIX 线程库(POSIX Threads,简称 pthread)。POSIX 线程库是用于多线程编程的标准库,提供了创建和管理线程的函数和数据类型。使用 -lpthread 标志告诉编译器在链接时将 POSIX 线程库与你的代码一起链接,以便在代码中使用多线程相关的函数和数据类型。

-g: 这个标志用于在生成的可执行文件中包含调试信息。调试信息包括源代码行号、变量名等,有助于在调试程序时进行断点设置和变量查看。

-Wall, -Wextra, -Werror: 这些标志用于开启编译器的警告信息。-Wall 启用常见的警告,-Wextra 启用更多额外的警告,-Werror 将警告视为错误,编译过程中如果有警告产生将会导致编译失败。

-std=c++XX: 这个标志指定要使用的 C++ 标准的版本。-std=c++11、-std=c++14、-std=c++17 和 -std=c++20 分别表示 C++11、C++14、C++17 和 C++20 的标准。

-I: 这个标志用于指定包含头文件的搜索路径。 是包含头文件的目录路径。

-L: 这个标志用于指定库文件的搜索路径。 是库文件所在的目录路径。

-l: 这个标志用于链接一个库文件。 是要链接的库的名称,例如 -lmath 链接数学库。

这些只是一些常见的 C++ 编译器标志示例,还有许多其他标志可用于更精确地控制编译过程和代码生成。请注意,不同的编译器可能会有不同的标志选项,因此请参考您所使用的具体编译器的文档以了解更多详细信息。

标签:标志,代码,C++,编译,编译器,优化,CPU
From: https://www.cnblogs.com/yhm138/p/17472772.html

相关文章

  • C++面试八股文:了解位运算吗?
    C++面试八股文:了解位运算吗?某日二师兄参加XXX科技公司的C++工程师开发岗位第12面:面试官:了解位运算吗?二师兄:了解一些。(我很熟悉)面试官:请列举以下有哪些位运算?二师兄:按位与(&)、按位或(|)、按位异或(^),按位取反(~)、左移(<<)和右移(>>)。面试官:好的。那你知道位运算有什么优势吗?......
  • 《C++》继承
    继承classA:publicB子类:继承方式父类classPhone{public: Phone() { frame="框架"; screen="屏幕"; battery="电池"; }public: stringframe; stringscreen; stringbattery;};classBrand:publicPhone{public: Brand(strin......
  • 编译原理实验二 使用lex创建词法分析器
    实验二直接上代码吧,其实我也不怎么知道哪里是致命的,课上听老师的课后,将代码写上,但是运行在环境里面还是不行,把注释去掉就可以了,不知道会不会是注释的问题%{#include<stdio.h>#include"define.h"intlineno=1; TokenTypeid2keyword(constchar*token);%}newline ......
  • Windows 下编译 OpenCV 和 OpenCV-contrib
    文章目录导言环境准备源码获取环境获取配置CMake并编译ConfigureGenerate生成项目总结导言在本文中,我们将介绍如何在Windows系统下编译OpenCV和OpenCV-contrib。OpenCV是一个开源的计算机视觉库,它包含了许多图像处理和计算机视觉的功能。而OpenCV-contrib则是一个由社......
  • C++面试八股文:聊一聊指针?
    某日二师兄参加XXX科技公司的C++工程师开发岗位第17面:面试官:聊一聊指针?二师兄:好的。面试官:你觉得指针本质上是什么?二师兄:这要从内存地址开始说起了。如果有一块容量是1G的内存,假设它的地址是从0x00000000到0x3fffffff,每一个字节都对应一个地址。当我们声明一个变量并初始化它......
  • C++面试八股文:聊一聊指针?
    某日二师兄参加XXX科技公司的C++工程师开发岗位第17面:面试官:聊一聊指针?二师兄:好的。面试官:你觉得指针本质上是什么?二师兄:这要从内存地址开始说起了。如果有一块容量是1G的内存,假设它的地址是从0x00000000到0x3fffffff,每一个字节都对应一个地址。当我们声明一个变量并初始化......
  • Linux编译静态库、动态库
     一、Linux上编译静态库#1.编译成.o文件gcc-ca.cb.c//2.编译成静态库ar-rliba.aa.ob.o//3.链接成可执行文件gccmain.c-omain-L[库所在路径]-l[库名]g++main.cpp-omain-L./-la  二、Linux上编译动态库//1.把cpp封装成so库g++-fPIC-sh......
  • C++增删改查+MySQL
    右键项目属性 点击编辑 选择mysql安装目录的include文件夹 包含了头文件之后包含库文件 点击编辑在mysql安装路径下面选择  选择编辑之后添加看这个文件下面有没有这个输入的文件依赖 有就代表成功连接数据库 创建数据库:createdatabasestudent_mana......
  • GESP-C++-4
    GESPC++四级样题卷在C++中,指针变量的大小(单位:字节)是()A.2B.4C.8D.与编译器有关答案:D以下哪个选项能正确定义一个二维数组()A.inta[][];B.charb[][4];C.doublec[3][];D.boold[3][4];答案:D在C++中,以下哪种方式不能用于向函数传递参数()A.值传递B.......
  • GESP-C++-3
    GESPC++三级样题卷下列关于负数的原码、反码、补码的描述中,正确的是()A.原码和反码互为按位取反(符号位除外),补码为反码加1B.原码和反码互为按位取反(符号位除外),补码为原码加1C.反码和补码互为按位取反(符号位除外),原码为反码加1D.补码和原码互为按位取反(符号位除外),反......