为了补充Yakk 的回答,我决定发布一些程序集来确认这一点。我已经用作std::string
测试类型。
foo<std::string>.bar()
- 没有铸造
pushq %rbp
movq %rsp, %rbp
subq $32, %rsp
movq %rcx, 16(%rbp)
movq %rdx, 24(%rbp)
movq 24(%rbp), %rax
movq %rax, %rcx
call _Z19some_other_functionRKSs
nop
addq $32, %rsp
popq %rbp
ret
foo<std::string>.bar()
-static_cast<T>()
pushq %rbp
pushq %rbx
subq $56, %rsp
leaq 128(%rsp), %rbp
movq %rcx, -48(%rbp)
movq %rdx, -40(%rbp)
movq -40(%rbp), %rdx
leaq -96(%rbp), %rax
movq %rax, %rcx
call _ZNSsC1ERKSs // std::string.string()
leaq -96(%rbp), %rax
movq %rax, %rcx
call _Z19some_other_functionRKSs
leaq -96(%rbp), %rax
movq %rax, %rcx
call _ZNSsD1Ev // std::string.~string()
jmp .L12
movq %rax, %rbx
leaq -96(%rbp), %rax
movq %rax, %rcx
call _ZNSsD1Ev // std::string.~string()
movq %rbx, %rax
movq %rax, %rcx
call _Unwind_Resume
nop
.L12:
addq $56, %rsp
popq %rbx
popq %rbp
ret
此代码仅使用生成-O0
。任何优化级别都会平衡这两种情况。