1. 程式人生 > >c++成員函式儲存方式

c++成員函式儲存方式

轉自:點選開啟連結

用類去定義物件時,系統會為每一個物件分配儲存空間。如果一個類包括了資料和函式,要分別為資料和函式的程式碼分配儲存空間。


按理說,如果用同一個類定義了10個物件,那麼就需要分別為10個物件的資料和函式程式碼分配儲存單元,如圖8.4所示。


圖8.4   能否只用一段空間來存放這個共同的函式程式碼段,在呼叫各物件的函式時,都去呼叫這個公用的函式程式碼。如圖8.5所示。


圖8.5
顯然,這樣做會大大節約儲存空間。C++編譯系統正是這樣做的,因此每個物件所佔用的儲存空間只是該物件的資料部分所佔用的儲存空間,而不包括函式程式碼所佔用的儲存空間。如果聲明瞭一個類:

   
  1. class Time
  2. {
  3. public:
  4. int hour;
  5. int minute;
  6. int sec;
  7. void set( )
  8. {
  9. cin>>a>>b>>c;
  10. }
  11. };
可以用下面的語句來輸出該類物件所佔用的位元組數:
    cout<<sizeof(Time)<<endl;
輸出的值是12。

這就證明了一個物件所佔的空間大小隻取決於該物件中資料成員所佔的空間,而與成員函式無關。


函式程式碼是儲存在物件空間之外的。如果對同一個類定義了10個物件,這些物件的成員函式對應的是同一個函式程式碼段,而不是10個不同的函式程式碼段。 需要注意的是,雖然呼叫不同物件的成員函式時都是執行同一段函式程式碼,但是執行結果一般是不相同的。

不同的物件使用的是同一個函式程式碼段,它怎麼能夠分別對不同物件中的資料進行操作呢?

原來C++為此專門設立了一個名為this的指標,用來指向不同的物件。需要說明:
  1. 不論成員函式在類內定義還是在類外定義,成員函式的程式碼段都用同一種方式儲存。
  2. 不要將成員函式的這種儲存方式和inMne(內建)函式的概念混淆。不要誤以為用inline宣告(或預設為inline)的成員函式,其程式碼段佔用物件的儲存空間,而不用 inline宣告的成員函式,其程式碼段不佔用物件的儲存空間。不論是否用inline宣告,成員函式的程式碼段都不佔用物件的儲存空間。用inline宣告的作用是在呼叫該函式時,將函式的程式碼段複製插人到函式呼叫點,而若不用inline宣告,在呼叫該函式時,流程轉去函式程式碼段的人口地址,在執行完該函式程式碼段後,流程返回函式呼叫點。inline與成員函式是否佔用物件的儲存空間無關,它們不屬同一個問題,不應搞混。
  3. 應當說明,常說的“某某物件的成員函式”,是從邏輯的角度而言的,而成員函式的儲存方式,是從物理的角度而言的,二者是不矛盾的。