2017-07-30 97 views
0

看看C++内联优化

func(int): 
    imul edi, edi 
    mov eax, edi 
    ret 
main: 
    push rbx 
    mov rdi, QWORD PTR [rsi+8] 
    mov rbx, rsi 
    mov edx, 10 
    xor esi, esi 
    call strtol 
    imul eax, eax 
    mov edi, OFFSET FLAT:std::cout 
    mov esi, eax 
    call std::basic_ostream<char, std::char_traits<char> >::operator<<(int) 
    mov rdi, QWORD PTR [rbx+16] 
    mov edx, 10 
    xor esi, esi 
    call strtol 
    imul eax, eax 
    mov edi, OFFSET FLAT:std::cout 
    mov esi, eax 
    call std::basic_ostream<char, std::char_traits<char> >::operator<<(int) 
    mov eax, 1 
    pop rbx 
    ret 
_GLOBAL__sub_I__Z4funci: 
    sub rsp, 8 
    mov edi, OFFSET FLAT:std::__ioinit 
    call std::ios_base::Init::Init() 
    mov edx, OFFSET FLAT:__dso_handle 
    mov esi, OFFSET FLAT:std::__ioinit 
    mov edi, OFFSET FLAT:std::ios_base::Init::~Init() 
    add rsp, 8 
    jmp __cxa_atexit 

显INLINE我的例子here OR 以下C++ &匹配组件

IMPLICIT INLINE

#include <iostream> 

int func(int i) 
{ 
    return i * i; 
} 

int main(int argc, char *argv[]) { 

    auto value = atoi(argv[1]); 
    std::cout << func(value); 


    value = atoi(argv[2]); 
    std::cout << func(value); 

    return 1; 
} 

结果

#include <iostream> 

inline int func(int i) 
{ 
    return i * i; 
} 

int main(int argc, char *argv[]) { 

    auto value = atoi(argv[1]); 
    std::cout << func(value); 


    value = atoi(argv[2]); 
    std::cout << func(value); 

    return 1; 
} 

导致

main: 
    push rbx 
    mov rdi, QWORD PTR [rsi+8] 
    mov rbx, rsi 
    mov edx, 10 
    xor esi, esi 
    call strtol 
    imul eax, eax 
    mov edi, OFFSET FLAT:std::cout 
    mov esi, eax 
    call std::basic_ostream<char, std::char_traits<char> >::operator<<(int) 
    mov rdi, QWORD PTR [rbx+16] 
    mov edx, 10 
    xor esi, esi 
    call strtol 
    imul eax, eax 
    mov edi, OFFSET FLAT:std::cout 
    mov esi, eax 
    call std::basic_ostream<char, std::char_traits<char> >::operator<<(int) 
    mov eax, 1 
    pop rbx 
    ret 
_GLOBAL__sub_I_main: 
    sub rsp, 8 
    mov edi, OFFSET FLAT:std::__ioinit 
    call std::ios_base::Init::Init() 
    mov edx, OFFSET FLAT:__dso_handle 
    mov esi, OFFSET FLAT:std::__ioinit 
    mov edi, OFFSET FLAT:std::ios_base::Init::~Init() 
    add rsp, 8 
    jmp __cxa_atexit 

在该示例中,如果线路5被注释的那样,码的最优化内联函数“FUNC”在两个调用点,但它留下的组件在生成的二进制文件中的func。但是,如果'func'被明确内联,则该函数在输出程序集中不存在。

为什么GCC的优化器离开隐含内联函数在编译的程序集,即使内联函数的操作是真正与调用代码内联?

+0

在这里发表您的代码中的问题,请。如果你想得到我们的帮助,你应该尽我们的方便。 –

+0

装配体如何?我使用Godbolt的原因是因为它很容易证明发生的事情。 – tuskcode

+0

直接在问题中发布代码。像Godbolt这样的外部资源链接是很好的演员。发布一段代码和一个链接都没有问题。 –

回答

0

,如果它被标记static功能将完全消失。因为它目前没有标记为static,所以它可能被另一个编译单元引用,所以它不能被消除。