[英]What is performance difference between different class or struct initialization methods?
在c ++中,我们有不同类型的初始化类或结构成员变量,其中之一是:
struct foo {
foo() : a(true), b(true), c(true) {}
bool a;
bool b;
bool c;
} bar;
另一个是:
struct foo {
bool a = true;
bool b = true;
bool c = true;
} bar;
他们之间有区别吗?
哪个更好用?
TL; DR除非您知道自己必须这样做,否则不要在乎这些琐碎的小事。 并且,如果需要,您需要分析混凝土装配。
通常,从纯语言的角度来看,这样的问题是没有道理的。 就其价值而言,C ++编译器可以根据需要降低性能。 任何表现出相同行为的程序都是合法的,并且性能不是可见的效果。
谈论性能仅在使用特定编译器和配置(尤其是优化)的具体组装的具体应用中才有意义。
全面研究:我将在godbolt编译器资源管理器上使用clag 7.0.0
您的情况很奇怪,因为它定义了全局值。对于默认优化选项:
因此,显然选项2似乎更好:
__cxx_global_var_init: # @__cxx_global_var_init
push rbp
mov rbp, rsp
movabs rdi, offset bar
call foo::foo() [base object constructor]
pop rbp
ret
foo::foo() [base object constructor]: # @foo::foo() [base object constructor]
push rbp
mov rbp, rsp
mov qword ptr [rbp - 8], rdi
mov rdi, qword ptr [rbp - 8]
mov byte ptr [rdi], 1
mov byte ptr [rdi + 1], 1
mov byte ptr [rdi + 2], 1
pop rbp
ret
_GLOBAL__sub_I_example.cpp: # @_GLOBAL__sub_I_example.cpp
push rbp
mov rbp, rsp
call __cxx_global_var_init
pop rbp
ret
bar:
.zero 3
bar2:
.byte 1 # 0x1
.byte 1 # 0x1
.byte 1 # 0x1
但是,使用-O1
可以使代码-O1
:
bar:
.byte 1 # 0x1
.byte 1 # 0x1
.byte 1 # 0x1
bar2:
.byte 1 # 0x1
.byte 1 # 0x1
.byte 1 # 0x1
在程序中使用foo
作为类型时,对于-O0
和-O1
两种情况都会生成ctor(每种情况下的ctor相同,每个优化级别不同)。 参见: https : //godbolt.org/z/0il6ou
对于-O2
,对象溶解。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.