c++ - GNU 编译器优化

标签 c++ optimization gcc compiler-construction

我对编译器知之甚少,但知道它们足够复杂和智能,可以优化您的代码。假设我有这样的代码:

 string foo = "bar";
 for(int i = 0; i < foo.length(); i++){
     //some code that does not modify the length of foo
 }

GNU 编译器是否足够聪明,可以意识到 foo 的长度在此循环过程中不会改变,并用 foo.length() 调用替换正确的值(value)?还是会为每个 i 比较调用 foo.length()

最佳答案

由于 Mysticial 和 Kerrek 都正确地建议查看生成的程序集,下面是一个示例:

#include <string>
using namespace std;

int does_clang_love_me(string foo) {
    int j = 0;
    for (int i = 0; i < foo.length(); i++) {
        j++;
    }
    return j;
}

我将上面的代码保存在test.cpp中,编译如下:

$ clang++ -o test.o -Os -c test.cpp

-Os 开关告诉 clang 尝试优化最小代码大小。 GCC 有一个相应的开关可以使用。为了查看程序集,我用 otool 命中了生成的目标文件,因为我现在正好在使用 mac。其他平台也有类似的工具。

$ otool -tv test.o

test.o:
(__TEXT,__text) section
__Z16does_clang_love_meSs:
0000000000000000    pushq   %rbp
0000000000000001    movq    %rsp,%rbp
0000000000000004    movq    (%rdi),%rax
0000000000000007    movq    0xe8(%rax),%rcx
000000000000000b    xorl    %eax,%eax
000000000000000d    testq   %rcx,%rcx
0000000000000010    je  0x0000001e
0000000000000012    cmpq    $0x01,%rcx
0000000000000016    movl    $0x00000001,%eax
000000000000001b    cmoval  %ecx,%eax
000000000000001e    popq    %rbp
000000000000001f    ret

就像Mysticial说的;这只是一个变量访问。

关于c++ - GNU 编译器优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8130975/

相关文章:

c++ - 在 C++20 中仍然无法转发所有可调用对象吗?

objective-c - 安排生成敌人的方法或使用敌人缓存的更新方法是否更有效?

c# - 存储方法返回还是重复调用?

ubuntu - 汇编 x86 nasm 输出浮点值

c - C 中类似函数的宏定义

c++ - sscanf() 格式字符串的官方定义?

c++ - 如果不使用,双端队列会减慢程序速度吗?

c++ - 如何优化和提高这个涉及浮点运算的特定代码的效率?

c - 使用 gcc 在 32 位模式下原子读/写 64 位值

c++ - Fortran 中的 STL 类似物