簡體   English   中英

不同的類或結構初始化方法之間的性能差異是什么?

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

您的情況很奇怪,因為它定義了全局值。對於默認優化選項:

  1. 生成了c'tor並將對象存儲為零
  2. 沒有代碼,對象生成為3個

因此,顯然選項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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM