2015-09-07 49 views
0

在C++中,如果我這樣定義如下非靜態成員函數,爲每個對象創建生成的機器代碼的一個副本?

int func1(int a, int b){ 
    int res; 
    // do some stuff for a, b, res; 
    return res; 
} 

我知道只會有一個機器代碼副本由編譯器生成func1如果沒有內聯(糾正我,如果我錯了)的功能,在程序執行期間,每次調用func1都會調用機器代碼的副本。然而,對於在類的成員函數,如下面

class A{ 
private: 
    // some data members and member functions 
public: // or alternatively private: 
    int func2(int a, int b){ 
     int res; 
     // do some stuff for a, b, res; 
     return res; 
    } 
} 

我有一些問題,如下:

  1. 如果我sizeof(A),它只返回數據成員的大小(可能包括填充字節) ,那麼func2存儲在哪裏?是否將func2存儲在與數據成員連續的一段內存中?如果沒有,是不是會懲罰緩存?
  2. 如果我聲明std::vector<A> v(1000),會生成1000份機器碼func2的生成碼?如果是的話,我認爲這會導致大量的內存浪費和性能劣勢,比如在func1之外聲明的功能(糾正我,如果我錯了)。
+0

另外:http://stackoverflow.com/questions/24504913/where-are-functions-of-an-object-stored-in-memory – NathanOliver

回答

1

在C++中,類成員函數的實現方式與常規C風格函數基本相同。但是,它們有一個「祕密」的第一個參數,它是指向該方法被調用的類的實例的指針,即this指針。因此,實例化類成員函數只有一個副本。

(大約有多個編譯單元和鏈接一些潛在的問題......但因爲你在這個問題忽略他們,我們會保持現在忽略他們的便利。)

如果你想看到自己,你可以指向一個類的各種實例的成員函數,並比較它們以查看它們是否相等。

+0

謝謝。你提到了一些關於多個編譯和鏈接的內容,你知道我在哪裏可以找到一些材料來閱讀它們嗎?再次感謝。 – Allanqunzi

相關問題