2017-06-28 4 views
-3

与えられたxとyは同じサイズですが、yには別の機能があります。どのようなものがsizeofに含まれています、そして何がありませんか?なぜ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

各structインスタンスはそれ自身の補数を持つため、データメンバはstructのサイズに貢献します。通常の関数メンバは、struct型ごとに1つしかないので、構造体には含まれていません。 –

+0

メンバ関数は、クラス型への参照を最初のパラメータとして取る自由関数とほぼ同じと見なすことができます。 – Justin

答えて

6

何の事はsizeofに含まれており、どのようなものではありませんか?

は、タイプの各インスタンスの一部としてメモリに格納する必要があるものだけを含みます。

この関数は、struct yのすべてのインスタンスで同じなので、構造体定義の一部として格納されません(クラスまたは構造体の場合、インスタンスに割り当てられる必要があるメモリの量を返します)。それは関数が構造上のメソッドとして呼び出されるようにします。しかし、それが関数ポインタであれば、ポインタは構造体の一部であり、そのサイズに寄与します。

2
5.3.3 Sizeof                                                                                                                                                                                                                   [expr.sizeof]

        sizeofオペレータは、そのオペランドのオブジェクト表現のバイト数を与えます。
             オペランドが 未評価のオペランド(条項5)で発現、または タイプIDを括弧
             のいずれかです。 sizeof オペレータは、その基礎となるタイプ、すべての前
             に固定されていない列挙 型に、
             関数または不完全型を持つ式に適用してはなりません列挙子が宣言されているか、括弧内にそのような名前の 、または
             ビットフィールドを指定するglvalue。 sizeof(char)sizeof(signed char)
              sizeof(unsigned char)他の基本的なタイプ
             (3.9.1)に適用 sizeofの結果は 実装である1です。定義される。 【 :特に、 sizeof(bool) は、      sizeof(char16_t)        
sizeof(char32_t)
、そしてsizeof(wchar_t) は実装定義です。
              — エンドノート] [バイトオブジェクト
             表現の定義については3.9の定義については1.7を参照
。 — エンドノート]

       基準または参照タイプに適用された場合、結果が参照型のサイズです。
             クラスに を適用すると、結果は、アレイ内のそのタイプの 配置オブジェクトに必要なパディングを含む、そのクラスのオブジェクト
             のバイト数であります。
           ほとんどの派生クラスは、ゼロ(1.8)より大きくなければなりません。 ベースに
             クラスのサブオブジェクトをsizeofを適用した結果は、基本クラス型のサイズです。 アレイに を適用すると、結果は
             アレイ内のバイトの総数です。これは、N 素子のアレイの大きさは、要素のN
             倍のサイズであることを意味します。

        sizeofオペレータは、関数へのポインタに適用することができるが、機能に直接
             適用してはなりません。

++ CでC++ Online Working Draft

、冗長コピーを格納することになるない正気実装オブジェクト・インスタンス内の関数のマシンコードと大量のスペースが必要になるだけでなく、大部分のアーキテクチャ(とにかくわかっている)は、マシンコードとデータを混在させることができないため、オブジェクト表現のサイズには寄与しません。

関連する問題