在 C++ 中有效使用编译指示

Using pragmas efficiently in C++

提问人:MELTFREEZE 提问时间:7/2/2023 更新时间:7/2/2023 访问量:146

问:

我是一个有竞争力的程序员,我在我的代码中使用编译指示。我使用的编译指示是:

#pragma GCC optimize("O3")
#pragma GCC optimization("Ofast,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")

但是最近我提交了一个代码,其中带有编译指示的代码比没有编译指示的代码花费了更多的时间?谁能帮我了解何时使用此类编译指示以及何时不使用它们?

我试图在 Google 和 Codeforces 上在线搜索它,但没有好的来源或文章来详细研究编译指示。谁能帮忙?

C++ 编译指示

评论

1赞 user17732522 7/2/2023
O3如果事后这样做,是多余的。后者支持前者的超集优化。 也很危险,因为它可以进行优化,使某些正常定义的行为无法定义,并可能以其他不可能的方式影响程序的行为。单独列出所有目标标志也很危险。你无法知道编译和运行程序的系统是否支持它们!相反(至少在命令行上)可用于完全启用主机系统支持的那些。OfastOfast-march=native

答:

2赞 ComicSansMS 7/2/2023 #1

这些 s 控制编译器应用的优化。在竞争性编程之外,通过命令行选项进行配置比使用 进行配置要常见得多,因此在搜索命令行选项时,您将更有可能找到好的资源。例如,查看 gcc 优化选项的官方文档#pragma#pragma

至于某个特定选项是否会使您的代码更快:除非您尝试,否则您不会知道。首先构建优化是因为对于某些用例来说它会更快,但是您的特定程序是否会从中受益?这是一个很难回答的问题。即使是具有多年经验的编译器编写者有时也会对此感到惊讶。你能做的最好的事情是了解特定优化实际上是如何影响生成的机器代码的。一段时间后,您也许能够对性能优势形成粗略的直觉。

但为了确定,你真的必须衡量。这是一个非常复杂的问题,影响最终结果的因素有很多。