問題タブ [flexible-array-member]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
144 参照

c - 柔軟な配列メンバーを持つ構造体の配列を快適に割り当てる方法は?

柔軟な配列メンバーを持つ次の構造体があります。

ここで、この構造体を連続して (配列のように) 配置するためにメモリを割り当てたいと考えています。struct test test_arr[]問題は、未定義の動作のような宣言です。6.7.2.1(p3):

複数の名前付きメンバーを持つ構造体の最後のメンバーは、不完全な配列型を持つ可能性があります。そのような構造体 (およびそのような構造体であるメンバーをおそらく再帰的に含む共用体) は、構造体のメンバーまたは配列の要素であってはなりません。

によって返されるポインターはmalloc、基本的なアラインメントを使用して任意のオブジェクト型へのポインターに変換できることがわかっています。次のコードを検討してください。

そうするための適合方法は何ですか?

0 投票する
1 に答える
123 参照

c - 名前のない構造体の柔軟な配列メンバー

次の例を検討してください。

デモ

このプログラムはクラッシュするだろうと思っていましたが、問題なく動作します。指定された6.5.3.4(p2)とおり:

このsizeof演算子は、そのオペランドのサイズ (バイト単位) を返します。これは、式または括弧で囲まれた型の名前の場合があります。サイズは、オペランドの型から決定されます。結果は整数です。オペランドの型が可変長配列型の場合、オペランドは評価されます。それ以外の場合、オペランドは評価されず、結果は整数定数になります

のオペランドの型sizeof ((*((tfa*) NULL)).info)[sz]は可変長配列であるため、オペランドを評価する必要があります。しかし、オペランドの評価は、NULLクラッシュにつながると予想していた逆参照を意味します。

コードの動作は明確に定義されていますか?

0 投票する
2 に答える
98 参照

c - キャストはタグ付けされた共用体よりもパフォーマンスが高くなりますか?

私は、ある種の一般的な型交換された値で動作する従来の仮想マシンを設計しています。現在は、タグ付き共用体で表されています。

私はこれについてオンラインで多くの文献を見つけましたが、これは問題に対するかなり正統なアプローチであると結論付けています。ただし、次のようなアプローチでパフォーマンスを改善できるかどうか疑問に思っています。

ここで、プリミティブ型にアクセスするための余分な間接化のコスト (および個々の割り当てを実行する必要がある - おそらくプーリングによって助けられる) と、のようなコレクションに保存されるメモリに対して保持されるコストとの間にトレードオフがあると推論していますval_vec。それが表す現在ファット ポインターのサイズ。ここでの簡単な答えは「測定する」であることはわかっていますが、それ自体が完全な実装ではない、適切に代表的なモデルを思い付くのに苦労しています。

この 2 番目のアプローチの名前はありますか? また、これが慎重に管理されると仮定すると (ただし、未定義の動作が発生しないと仮定しないでください)、私が説明していない広く理解されているリスクはありますか? ここではどのアプローチが好ましいですか?

ちなみに、柔軟な配列メンバーの使用も同様に使用できますか?

0 投票する
2 に答える
246 参照

c - sizeof() 長さゼロの配列メンバーを持つ構造体

私はsizeof()Cでの出力について混乱しています.私が持っているとしましょう:

4になるはずですがsizeof(struct foo)、gcc でコンパイルすると 3 が返されます。また、厳密な設定-pedantic-errorsでコードをコンパイルすると、コンパイル エラーが発生します。

誰かがこの動作を理解するのを手伝ってくれますか?