[英]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.