2017-09-27 15 views
7

私はいつも、TタイプのN要素の配列のサイズが、sizeofによって返され、正確にN倍のsizeof(T)であることが保証されていると仮定していました。sizeof(T [N])== N * sizeof(T)は保証されていますか?

comments on this questionは私にそれを疑わせました。評判の良いユーザーからは、配列にはパディングが含まれている可能性があるという主張があります。もちろん、そのようなプラットフォームは存在しないかもしれませんが、許可されていますか?

許容される場合、N * sizeof(T)の配列の必要な記憶域の計算や、sizeof(a)/sizeof(a[0])を使用した配列の要素数の計算など、多くの一般的な慣用句が使用できなくなります。

+0

「sizeof」は常に実行時の値ではなく静的な型を扱っていることを考えると、実際のメモリがどのように動作するかは考えません。 'sizeof(T [N])== N * sizeof(T)'が型システムでありプリプロセッサの関心事であるかどうか。 –

+1

@AsadSaeeduddin - 正しい、私は別のことを暗示しているとは思わない?それとも今削除されたコメントへの返事だったのでしょうか? – BeeOnRope

+0

あなたがリンクしたスレッドからの議論にコメントしていました。配列が要素サイズの合計より多くのスペースを占めるランタイムがあるかもしれませんが、sizeof(T [N])が 'N * sizeof(T)であるという事実には関係しません'。 –

答えて

2

sizeofの全体の点には、該当するパディングが含まれています。配列のすべての要素は、前の要素の後のちょうどsizeof(T)バイトです。したがって、配列全体のサイズはN * sizeof(T)です。

+1

私は 'sizeof(T)'が配列*のためだけに余分なパディング*を許すかどうかという疑問に思っています。個々のオブジェクトにはすべてパディングがありますが、標準では配列自身が要素のパディングを超えてパディングすることができますか? –

+0

余分な詰め物はどこから来ますか? –

+0

コンパイラが 'sizeof(T [N])> N * sizeof(T)'と言っているので、末尾に余分な埋め込みがあります。 C++標準ではレイアウトについてはあまり言及しておらず、余分なパディングが 'T [N]'の整列要件を維持していれば、少なくとも 'T'の整列要件を満たす必要がありますまったく同じですが、わかりません)、許可されます。 –

11

はい。

アレイに適用された場合、結果は、アレイ内のバイトの総数である:[expr.sizeof]は約sizeofこのビットを含みます。これは、n要素の配列のサイズが要素のサイズのn倍であることを意味します。

+0

事は、「配列の総バイト数」がどこに定義されているのか分かりませんが、「これは暗黙のうちに...」という文が偽であると思います。私はその声明のない標準の残りの部分は、最後に目に見えない詰め物がないことを意味しないと思います。私が正しいとすれば、問題は文が「* n *要素の配列の大きさが要素の大きさに等しいことが保証されている」と等しいか、または標準。 –

+0

@DanielHもちろん、配列の最後にはパディングはありません。そのような詰め物が存在する可能性があることは、規格のどこにも言及されていない。 "配列型のオブジェクトには、連続して割り当てられた空でないタイプのTサブタイプの セットが含まれています。これ以上何もない。パディングバイトを持つのはクラスの型だけです。 –

+0

@ n.m。あなたが "もちろん"で行くなら、あなたは未定義の振る舞いをかなり早く得るでしょう。あなたがその見積もりを指摘したので、私はそれを見て覚えていますが、人々は、それらのものだけを含んでいなければならないかどうかは分かりませんでした。 –

関連する問題