C++の非POD型でsizeof
演算子を使用するのは安全ですか?この値は、すべてのメンバーのサイズよりも大きいか等しいでしょうか?C++の非POD型でsizeof演算子を使用するのは安全ですか
答えて
もちろん安全です。また、sizeof
はコンパイル時にと評価されています。
sizeof
非PODタイプは、空の基底クラスの最適化を除いて、すべてのメンバのサイズの合計よりもより小さくはなりません。
梱包の手配と、メンバーを持たないクラスが非ゼロのsizeof
を有するという事実のために、すべてのメンバーのサイズの合計よりも、である可能性があります。
空の基本クラスの最適化はどうでしょうか? – NathanOliver
@NathanOliver:はい、興味深いですが、実際に* sizeofのゼロを取得する例を想起させることができますか?そのような場合、空の基底クラスの最適化は許可されていないと思います。しかし、これについて間違っていることを証明することが大好きです。 – Bathsheba
sizeof(X)== 0ではなく[this](http://coliru.stacked-crooked.com/a/6955090c4ba3273e)です。全体は部品より少ない。 – NathanOliver
はい。 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
に評価されています。
ワーキングドラフト、[5.3.3/2]によれば:クラスに適用される場合
、結果は、アレイ内のそのタイプのオブジェクトを配置するために必要なパディングを含む、そのクラスのオブジェクトのバイト数であります。最も派生したクラスのサイズは0より大きくなければならない。基本クラスのサブオブジェクトにsizeofを適用すると、基底クラス型のサイズになります。
Here最後の文に関連する脚注:
基本クラスサブオブジェクトの実際のサイズが原因仮想基底クラスに、サブオブジェクトにはsizeofを適用した結果より少なく厳密であってもよいです基本クラスのサブオブジェクトに対するパディング要件。
だから:はい、それは安全であるとの結果がそのメンバーのすべてのより以上以下のサイズです。
- 1. Cのsizeof演算子の使用
- 2. Cのsizeof演算子の理解
- 3. sizeof演算子の問題
- 4. 型/クラスを比較するとき、 '=='演算子の代わりに 'is'演算子を使用するのは安全ですか?
- 5. C/C++ sizeof演算子:sizeof( 'a')が異なる値を返すのはなぜですか?
- 6. なぜsizeof()演算子はCで異なる出力
- 7. CのIF文の中でのsizeof演算子の動作
- 8. プロパティバインディングの角度安全ナビゲーション演算子
- 9. C++演算子()括弧 - 演算子Type()vs型演算子()
- 10. sizeof演算子で生成されたデータ型
- 11. 私のsizeof演算子に何が問題なのですか?
- 12. Visual C++での^演算子の使用
- 13. 安全でないコードの矢印演算子は何ですか?
- 14. ゼロ除算を避けるためのC#安全ナビゲーション演算子
- 15. C++の演算子は何ですか?
- 16. C#では、なぜ動的型を使用するとジェネリックで演算子を使用できますか?
- 17. 非クラス型のオーバーロード演算子[]
- 18. GroovyまたはJavaで算術演算に安全なナビゲーション演算子はありますか?
- 19. C#でクラスの型を検証する演算子を使用した後でも、キャストする演算子として使用しますか?
- 20. PythonでAND演算子とNOT演算子を使用する
- 21. sizeof演算子は、コンパイルのどの段階でgcc
- 22. Cポインタ演算はsizeof(構造体)
- 23. ||演算子は、PHPで非ブール型の値の間で選択するために使用されますか?
- 24. グループで演算子以上の演算子を使用できますか?
- 25. sizeof演算子と構造体
- 26. 演算子( - - )()演算子C#
- 27. C sizeOf演算子:myOwnSizeOf()関数を作成したい
- 28. Console.WritelineをC#の3進演算子で使用する
- 29. "+"演算子で使用できる汎用型
- 30. C#?? Rubyの演算子ですか?
データ型についての知識がないと安全ではないことを確認してください。 – nosbor
[参照資料](http://en.cppreference.com/w/cpp/language/sizeof) – NathanOliver