如果设置了多个优化标志,clang 会做什么?

What does clang do if more than one optimization flag is set?

例如,当您键入 clang -O3 -O0 时会发生什么?

行为是否与 gcc 中的行为相同?即,除最后一个优化标志外的所有标志都被忽略(描述为here and here)?

我在手册页中查找了 clang,但在优化标志部分找不到解释。

这是未定义的行为吗?

虽然测试用例没有提供统一行为的明确证据,但它可能暗示了一个或另一个方向,根据我在 Clang 的几个版本的测试用例中观察到的情况C 和 C++ 代码,似乎与 GCC 中一样,前面的冲突标志被忽略,最后一个保持不变。我确实查看了 Clang 文档,但似乎没有提及这种情况。

Sample C program with Clang 11.0.1

假设这可能不是问题,显然最后一面旗帜仍然存在。有人可能会争辩说这不是那么明显,例如,可以提出 更高 优化级别应该成立的论点。

至于为什么没有记录下来,只能推测,可能是对情况缺乏了解导致的。事实上,这至少应该像在 GCC 中一样记录在案。

我没有文档支持它,但这个测试表明它选择了最后一个:

klutt@desktop:/tmp$ clang f.c -O3; ls -l a.out
-rwxr-xr-x 1 klutt klutt 16752 Mar 19 15:37 a.out
klutt@desktop:/tmp$ clang f.c -O0; ls -l a.out
-rwxr-xr-x 1 klutt klutt 16704 Mar 19 15:37 a.out
klutt@desktop:/tmp$ clang f.c -O3 -O0; ls -l a.out
-rwxr-xr-x 1 klutt klutt 16704 Mar 19 15:37 a.out
klutt@desktop:/tmp$ clang f.c -O0 -O3; ls -l a.out
-rwxr-xr-x 1 klutt klutt 16752 Mar 19 15:37 a.out