[解決済み] この構造体はどうしてsizeof==0になるのですか?
質問
古い記事で
sizeof
が返す
0
. 高評価のユーザーから、標準では型や変数がsizeof 0を持つことはできないという回答がありましたが、私もそれに100%同意します。
しかし、そこには この新しい回答 があり、この解決策を提示しています。
struct ZeroMemory {
int *a[0];
};
私はちょうどダウンボーティングしてコメントするところでしたが、ここで過ごした時間は、私が100%確信していることでさえ確認することを教わりました。それで...驚いたことに、両方とも
gcc
と
clang
は同じ結果を示す。
sizeof(ZeroMemory) == 0
. さらに言えば、変数のsizeofは
0
:
ZeroMemory z{};
static_assert(sizeof(z) == 0); // Awkward...
な、なんだ......?
どうしてこんなことが可能なのでしょうか?
どのように解決するのですか?
C 言語が標準化される以前は、コードが別のものからゼロ サイズの型へのポインタを決して引こうとしない限り、多くのコンパイラーはゼロ サイズの型の処理に何の問題もありませんでした。 そのような型は有用であり、それをサポートすることはそれを禁止するよりも簡単で安上がりだったのです。 しかし、他のコンパイラはそのような型を禁止することに決め、コードがゼロサイズの配列を作成しようとすると、静的アサーティションコードはその事実に依存していたかもしれません。 標準の作成者は選択に迫られました。
-
コンパイラがゼロサイズの配列宣言を黙って受け入れることを許可する。 そのような宣言の目的が診断のトリガーとなるような場合であっても 診断してコンパイルを中断するような場合でも、ゼロサイズの配列宣言を黙って受け入れることを許可し、すべてのコンパイラに対して このような宣言は、ゼロサイズのオブジェクトを生成するものとして、すべてのコンパイラが(必ずしも黙認する必要はありませんが)受け入れることを要求します。 サイズのオブジェクトを生成するものとして、すべてのコンパイラーがそのような宣言を受け入れることを要求します。
-
コンパイラがゼロサイズの配列宣言を黙って受け入れることを許可します。 そのような宣言の目的が診断のトリガーとなるような場合であっても 診断し、コンパイルを中断するような場合でも、コンパイラがゼロサイズの配列宣言を黙って受け入れることができるようにします。 宣言に遭遇したコンパイラーは、コンパイルを中断するか、または任意にコンパイルを続行できるようにします。
-
コードがゼロサイズの配列を宣言した場合、実装が診断を発行することを要求する。 ゼロサイズの配列を宣言した場合、実装が診断を出すことを要求します。 コンパイルを中止するか、(適切と思われるセマンティクスで) コンパイルを続行するかを を実行できるようにします。
標準の作成者は、#3 を選択しました。 その結果、ゼロサイズの配列宣言は、たとえそのような構成が標準によって禁止される前に広くサポートされていたとしても、標準によって "extension" と見なされています。
C++ 標準規格では、空のオブジェクトの存在を認めていますが、空のオブジェクトのアドレスをトークンとして使用できるようにするために、最小のサイズが 1 であることを義務付けています。 しかし、オブジェクトにサイズ0のメンバが含まれている場合、C++標準は、そのような宣言を含むプログラムが診断を開始しなければならないという事実以外に、その宣言の処理方法について何の要件も課していません。 このような宣言を使用するほとんどのコードは、結果として生じるオブジェクトのサイズが 0 であることを想定しているため、このようなコードを受け取るコンパイラにとって最も有益な動作は、このように扱うことです。
関連
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。
-
[解決済み] 文字列の単語を反復処理するにはどうすればよいですか?
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] なぜテンプレートはヘッダーファイルでしか実装できないのですか?
-
[解決済み] Linux上で動作するC++コードのプロファイリングを行うにはどうすればよいですか?
-
[解決済み] template "と "typename "キーワードはどこに、なぜ入れなければならないのですか?
-
[解決済み] 構造体のsizeofは、なぜ各メンバーのsizeofの合計と等しくないのですか?
-
[解決済み] なぜsizeof(x++)はxをインクリメントしないのですか?
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】getline()が何らかの入力の後に使用されると動作しない 【重複あり
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外
-
[解決済み】浮動小数点例外エラーが発生する: 8
-
[解決済み】リンカーエラーです。"リンカ入力ファイルはリンクが行われていないため未使用"、そのファイル内の関数への未定義参照
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み】エラー:free(): 次のサイズが無効です(fast)。
-
[解決済み】標準ライブラリにstd::endlに相当するタブはあるか?
-
[解決済み] to_string は std のメンバーではない、と g++ が言っている (mingw)
-
[解決済み] 変数サイズのオブジェクトが初期化されないことがある c++