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

发布时间 2023-06-18 08:55:33作者: yhm138

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++ 编译器标志示例,还有许多其他标志可用于更精确地控制编译过程和代码生成。请注意,不同的编译器可能会有不同的标志选项,因此请参考您所使用的具体编译器的文档以了解更多详细信息。