2017-06-28 70 views
-3

鑑於以下情況,您會看到x和y的大小相同,但是y具有附加功能。 sizeof包含什麼東西,什麼東西不是?爲什麼尺寸不關心功能?

struct x 
{ 
    double a; 
    double b; 
    double c; 
    double d; 
}; 
struct y 
{ 
    double a; 
    double b; 
    double c; 
    double d; 
    y(double q, double r, double s, double t) : a(q), b(r), c(s), d(t) {}; 
}; 
std::cout << sizeof(x)-sizeof(y) <<std::endl; 
+0

'y()'是不是虛擬的? – EOF

+0

數據成員對結構的大小起作用,因爲每個結構實例都有它們自己的補充;普通函數成員不會,因爲每個結構類型只有一個,並且它不包含在結構中。 –

+0

可以將成員函數看作與引用類類型作爲第一個參數的自由函數幾乎相同。 – Justin

回答

6

什麼東西都包含在的sizeof,什麼東西都沒有?

sizeof()只包括必須作爲類型的每個實例的一部分存儲在內存中的東西。 (對於類或結構,它返回需要爲實例分配的內存量。)

由於函數對struct y的每個實例都是相同的,因此它不作爲結構的一部分存儲 - 定義它只允許將該函數作爲結構上的方法調用。但是,如果它是一個函數指針,指針將會是結構的一部分,並且會影響其大小。

2
5.3.3 Sizeof                                                                                                                                                                                                                   [expr.sizeof]

       的 sizeof操作者產生在其操作數的對象表示的字節數。
             該操作數是 任一種的表達,這是一個未計算的操作數(第5章),或一個
             括號 型-ID。所述 sizeof 操作者不得應用於具有
             功能或不完整的類型的表達式,爲枚舉 類型,其基礎類型是不固定的
             之前的所有其普查員已經宣佈,加入到括號內的 這種類型的名稱,或
               表示位域的glvalue。 sizeof(char)sizeof(signed char)
              sizeof(unsigned char)是1的 sizeof應用於任何其它類型的基本
             (3.9.1)結果 實施-defined。 [ :特別是, sizeof(bool)
              sizeof(char16_t)sizeof(char32_t),和 sizeof(wchar_t)是實現定義。
              — 注完] [ :請參閱1.7的 字節 和3.9 對象
             表示的定義中定義
。 — 注完]

       當施加到一個參考或引用類型,其結果是被引用類型的大小。
             當應用於 一類,結果是字節在該類
             包括在陣列中該類型的 放置物體所要求的任何填充的目的數。大小爲
               大多數派生類應該大於零(1.8)。 施加 sizeof到基座
             類子對象的結果是所述基類類型的大小。 當應用於 到陣列,其結果是
             陣列中的字節的總數。這意味着的 Ñ 元件的陣列的大小是一個元件的尺寸 Ñ
             倍。

       的 sizeof操作者可以應用到的指針的函數,但是不得直接
             施加到一個函數。

C++ Online Working Draft

在C++中,沒有理智執行將存儲的冗餘副本的對象實例中的功能的機器代碼;這不僅會浪費空間,大多數體系結構(無論如何,我都知道)不允許您以這種方式混合機器代碼和數據,所以它不會影響對象表示的大小。

相關問題