2016-07-08 1 views

答えて

5

もちろん安全です。また、sizeofコンパイル時にと評価されています。

sizeof非PODタイプは、空の基底クラスの最適化を除いて、すべてのメンバのサイズの合計よりもより小さくはなりません。

梱包の手配と、メンバーを持たないクラスが非ゼロのsizeofを有するという事実のために、すべてのメンバーのサイズの合計よりも、である可能性があります。

+0

空の基本クラスの最適化はどうでしょうか? – NathanOliver

+0

@NathanOliver:はい、興味深いですが、実際に* sizeofのゼロを取得する例を想起させることができますか?そのような場合、空の基底クラスの最適化は許可されていないと思います。しかし、これについて間違っていることを証明することが大好きです。 – Bathsheba

+1

sizeof(X)== 0ではなく[this](http://coliru.stacked-crooked.com/a/6955090c4ba3273e)です。全体は部品より少ない。 – NathanOliver

2

はい。 Sizeofは、オブジェクトを保持するのに十分なバイト数を返すことが保証されています。パディングやその他のタイプの「非表示」フィールド(シリアル化するためのパディングなど)が保証されます。

コンパイル時に評価されるのはおそらく唯一の警告ですが、それは多態性ではありません。 、

class Base 
{ 
    int x; 
}; 

class Derived : public Base 
{ 
    int y; 
}; 

int main() 
{ 
    Base* k = new Derived; 

    return sizeof(*k)/sizeof(int); 
} 

戻り1いうより2ある 、それはそれは、オブジェクトが実際に実行時にDerivedであってもその仮型Baseに評価されています。

2

ワーキングドラフト、[5.3.3/2]によれば:クラスに適用される場合

、結果は、アレイ内のそのタイプのオブジェクトを配置するために必要なパディングを含む、そのクラスのオブジェクトのバイト数であります。最も派生したクラスのサイズは0より大きくなければならない。基本クラスのサブオブジェクトにsizeofを適用すると、基底クラス型のサイズになります。

Here最後の文に関連する脚注:

基本クラスサブオブジェクトの実際のサイズが原因仮想基底クラスに、サブオブジェクトにはsizeofを適用した結果より少なく厳密であってもよいです基本クラスのサブオブジェクトに対するパディング要件。

だから:はい、それは安全であるとの結果がそのメンバーのすべてのより以上以下のサイズです。

関連する問題