使用成员初始化列表,
#include <string>
struct Fred {
Fred() : x_("hello") { }
std::string x_;
};
int main() {
Fred fred;
}
-O3 -fno-exceptions
Clang 3.9.1 和 gcc 6.3 使用( Compiler Explorer )生成以下内容:
main: # @main
xor eax, eax
ret
如果我们在 body 中做一个赋值:
#include <string>
struct Fred {
Fred() { x_ = "hello"; }
std::string x_;
};
int main() {
Fred fred;
}
两者都生成更多代码,例如 Clang 3.9.1 输出:
main: # @main
push rbx
sub rsp, 32
lea rbx, [rsp + 16]
mov qword ptr [rsp], rbx
mov qword ptr [rsp + 8], 0
mov byte ptr [rsp + 16], 0
lea rdi, [rsp]
xor esi, esi
xor edx, edx
mov ecx, .L.str
mov r8d, 5
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_replace(unsigned long, unsigned long, char const*, unsigned long)
mov rdi, qword ptr [rsp]
cmp rdi, rbx
je .LBB0_2
call operator delete(void*)
.LBB0_2:
xor eax, eax
add rsp, 32
pop rbx
ret
.L.str:
.asciz "hello"
所以看起来成员初始化列表确实更有效,至少在某些情况下,即使使用现代编译器也是如此。