2

C++03

$5.3.3/2 - 「最も派生したクラスのサイズはゼロ (1.8) より大きくなければならない」

$1.8/4 - 「それがビット フィールド (9.6) でない限り、最も派生したオブジェクトはゼロ以外のサイズを持ち、1 バイト以上のストレージを占有するものとします。」

私の質問は次のとおりです。

空のクラスのサイズは指定されておらず、実装は定義されていますか? コンパイラのドキュメントで文書化されているはずですか? 私の理解が正しい限り、これらの2つの引用はそれを非常に自由にしています。

4

2 に答える 2

4

指定されていません(0より大きくなければならないことを除いて)。実装も定義されていません(したがって、文書化する必要はありません)。

実装が空のクラスに1以外のサイズを使用する理由はわかりませんが(「空のクラス」とは、別のクラスから派生していないクラスについて話していると仮定します)、可能だと思います。


これが(実装が定義されているのではなく)不特定の動作であると判断するものについてのChubsdadの質問に対処するには:

この規格では、「不特定の動作」を次のように定義しています。

実装に依存する、整形式のプログラム構成と正しいデータの動作。どの動作が発生するかを文書化するために実装は必要ありません。

「実装定義の動作」を次のように定義します。

実装に依存し、各実装が文書化する、整形式のプログラム構成と正しいデータの動作

したがって、2つの違いは、実装定義の動作を文書化する必要があることだけです。標準では、動作を文書化する必要がある場合(通常、動作は実装定義であると言うことにより)が示されます。

残念ながら、標準では、動作が指定されていない(または定義されていない)と常に直接述べているわけではありません。したがって、いくつかの分析が必要です。

標準が言うので:

  • sizeof空のクラスの結果がゼロより大きいと評価される必要があります。
  • その値が何である必要があるかを示していません(ゼロより大きい)
  • 値を文書化する必要がある(または実装で定義されている)必要があるとは言っていません

除去のプロセスにより、空のクラスのサイズは指定されません。

この分析(およびC ++標準と同じくらい複雑なものの多くの分析)で考えられる問題は、空のクラスのサイズを特定の値にする必要がある、私が見逃した標準の他のコーナーがある可能性があることです。 。そして、その要件は、他のいくつかのルールからの推論によるものである可能性があります(またはそれは控除でしょうか?)。それは完全に述べられていないかもしれません。特定の問題に適用される可能性のある標準のすべての領域を追跡することは必ずしも容易ではありません。

もしそうなら、誰かがそれを書き留めて私の議論を打ちのめすでしょう。

于 2010-12-04T00:33:58.020 に答える
1

ほとんどの派生型は、クラス型 (C++ 標準 (intro.object) の 1.8) の完全なオブジェクトのクラスを意味します。したがって、インスタンス化された空のクラスには一意のアドレスが必要です。これは、sizeof(empty class)>0. ただし、これは、サイズがゼロの基底クラスを使用できることも意味します (これも C++ 標準の 1.8 にあります)。

したがって、空のクラスをインスタンス化する必要がある場合、サイズをゼロにすることはできません。それが基本クラスのサブオブジェクトである場合は、サイズが 0 になる可能性があります。

于 2010-12-04T00:40:11.030 に答える