簡體   English   中英

有多少種生成臨時對象/不必要調用構造函數的方法?

[英]How many ways of generating temporary objects/needlessly invoking constructor are there?

臨時對象/垃圾對象可能是超低延遲應用程序的一大瓶頸。 我試圖使自己意識到不必要調用構造函數的陷阱,所以我想知道是否有我不知道的方法。 當“無聲地”調用構造函數時,我知道以下幾種方式:

1)

//a temporary "object" is created when adding x and y and then assigned to z
int x,y,z;
z = x + y;    

2)

//A temporary object is created here when the return value is passed. Its also possible
//another temporary object is created during the assignment?
A a = my_function();

A my_function(){
    return new A();
}

3)

A a = my_function();

A my_function(){
    A a;
    return a;
}

4)參數通過值傳遞

A a;
my_function(a);

void my_function(A a){

}

5)不使用初始化程序列表:

class A{
   B b;
   C c;

   A(B bb, C cc):
   {
       this.b = bb;
       this.c = cc;
   }

}

還有其他示例隱式調用構造函數嗎?

A a = A(); (您的函數示例的一個簡單案例),盡管我相信如今大多數編譯器都對其進行了優化以指導初始化。 (不過,GCC可以選擇禁用該優化。)

順便說一句,您可能想看看http://en.wikipedia.org/wiki/Copy_constructor

,右值引用和移動語義可以解決幾種類型的不必要的臨時副本,這些副本發生在諸如按值返回和傳遞參數的情況下。 因此,您列出的某些內容不再適用於新標准。

IMO,你倒退了。 特別要考慮到,在優化的構建中,大多數情況下將完全刪除所有臨時工。

建議的方法是以易於查看的方式編寫正確的程序。 然后,如果您對性能不滿意,請放下Profiler,然后修復占用大部分時間的一小部分。 實踐表明,程序員很少會想到它。

從列表中避免的一件事是具有不可預測大小的類類型的按值參數。 大多數時間const&都可以。

避免分配和堅持初始化也是一個很好的指導原則,但出於性能考慮並非如此。 當然,它通常不適用於某些類型,例如集合。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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