2014-02-12 158 views
0

我有一個C結構具有相關功能:性能C結構對C++結構/

struct StructC { 
    int a; 
    int b; 
}; 

static inline StructC func1() 
{ 
    StructC ret; 

    //do something with variables ret.a and ret.b 

    return ret; 
} 

static inline void func2(StructC var) 
{ 
    //do something with variables var.a and var.b 
    ... 
} 

和C++結構:

struct StructCPP { 
    int a; 
    int b; 

    StructCPP func3()  //can also be static 
    { 
     StructCPP ret; 
     //do something with instance variables ret.a and ret.b 

     return ret; 
    } 

    void func4()   //can't use static here since it operates on the instance variables 
    { 
     //do something with instance variables a and b 
     ... 
    } 
}; 

我的問題:通過這些結構來時,這是更快函數/方法?

由於在StructC上運行的C函數是靜態的,所以只有一個實例駐留在內存中,但其結構中的C++方法會發生什麼?它的方法(func3()和func4())佔用每個實例的冗餘內存,還是C++編譯器優化它只保存一個實例,所以在傳遞C++結構時,只有實例變量a和b,通過了嗎?

該函數調用這些函數更快(如果有任何差異)?:

void functionA(StructC var);  //StructC as argument 
void functionB(StructCPP var); //StructCPP as argument 

(該程序是C和C++的混合物)

+5

如果我沒有弄錯,我相信結構被解釋爲C++中的類。 – turnt

+0

您傳遞_objects_,而不是_structs_。與結構關聯的方法不會被複制。如果這就是你要求的。 – stefan

+1

關於表現,在你問之前總是測試。你有沒有嘗試看看這裏有什麼區別?另外,我認爲你對結構的理解基本上是不正確的。 –

回答

3

將這些結構體傳遞給函數/方法時速度更快嗎?

成員函數的調用應該與將非指針作爲參數的非成員一樣快;因爲這正是一個(非虛擬的,非靜態的)成員函數。

第一個非成員函數可能比第一個成員稍快,因爲它不需要隱藏this參數。但是,它不訪問它所調用的對象,所以它可能是靜態的或非成員的;在這種情況下,它將與非會員一樣快。

第二個將其隱藏參數作爲指針,因此它可能比非成員函數獲取值的速度更慢或更快,具體取決於它是如何使用它的。

由於C結構是靜態的,只有一個實例駐留在內存中,但是C++結構會發生什麼?

C結構不是靜態的。您可以像創建局部變量那樣創建和銷燬它們,就像其他對象一樣 - 然後返回它的副本。 C++類在這方面是一樣的。

做它的方法(FUNC3()和FUNC4())佔據冗餘內存爲每個實例

不,成員函數不佔用類實例的內存。像非成員函數一樣,代碼只存在於一個地方;唯一真正的區別是成員函數傳遞了額外的參數。

如果類有虛函數,則該(典型地)增加了一個單一指針,的vptr,每個對象,用函數指針和其它運行時類型信息的,單一的靜態表的速度(在虛表)爲班級。

當傳遞C++結構時,只傳遞實例變量a和b嗎?

確實。這是一個標準佈局類,這意味着它包含的唯一內容就是其數據成員,就像C結構一樣。

哪些函數調用這些函數更快(如果有任何區別)?

它們應該是相同的;都通過值包含相同的數據成員的可微複製的對象。

+0

我已經將C結構聲明爲static.I已修改我的問題以反映我的初衷。 – Alterecho

+0

@Alterecho:不,你已經聲明這些函數是靜態的。你的例子有兩個結構類型的非靜態對象。 (我已經更新了第一段來解決您的更改)。 –

+0

因此,在傳遞StructC和StructCPP的對象時沒有性能差異? – Alterecho

2

代碼的方法C++ classstruct(完全一樣)僅包含一次在您的可執行文件中,並且只在內存中出現一次。無論您創建了多少個對象或多少次您稱之爲¹,都無關緊要。

方法和自由函數之間的唯一區別是該方法以this的形式獲得額外的「隱藏」參數。所以即使實例變量不是單獨傳遞的。


¹聲明方法inline(或等價地,定義它們的類定義)可能會導致同一代碼的多個拷貝被包括在最後的可執行文件。這種行爲通常非常適合編譯器特定的情況,並且在任何情況下也適用於免費函數inline

+0

另請注意,在上面的例子中:如果成員func3是靜態的,它甚至不應該有那些額外的參數,因此絕對沒有性能差異。 –

+0

@ComicSansMS:儘管'inline'不是保證,而只是編譯器的提示。坦率地說,我大多忽視了代碼並繼續在一般意義上回答。我會去解決這個問題。 – Jon

+1

@DavidKernin:即使對於非靜態方法,調用本身的性能差異也是絕對不可測量的。它可能不存在,例如如果調用約定和編譯器優化最終導致通過CPU寄存器傳遞一個或多個參數。 – Jon

0

,你可以肯定地說,考慮到語言規範的唯一的事,如下:structclassunion是在C++中只有3類的類型,這也正是相似structclass之間的由來。

對於其他任何你應該剖析,調試和比較不同的實現和編譯器,畢竟C++仍然是一種編譯語言,並不是所有的東西都可以說是一個給定的程序,如果你不編譯它。

+0

在我的情況下,StructC是一個C結構(也用於C代碼)。 – Alterecho

+0

@Alterecho爲什麼?與_C++ struct_有什麼區別?沒有這樣的區別,C++中的「struct」是'C++'代碼。 – user2485710

+0

假設我從另一個C程序中導入StructC? – Alterecho