4

malloc() のドキュメントによると、返されたポインターは、あらゆる種類の変数に対して適切に整列されます。私のシステムでは、long double のサイズは 12 ですが、malloc() によって返される一部のポインターは、12 バイトではなく 8 バイト境界に位置合わせされます (ptr % 12 は 4 になります)。ここで何が欠けているのか誰でも指摘できますか? 前もって感謝します。

4

5 に答える 5

5

明らかに、long double12 バイトにアラインする必要はありません。あなたのようなシステムでは、プリミティブ C 型の最大アラインメントは 8 バイトですdouble。アラインメントとサイズを混同しないでください - 多くの小さい (特にプリミティブ) 型は自然にアラインされる必要がありますが、つまり、独自のサイズにアラインされます。ハードウェア。

于 2013-06-29T13:31:25.713 に答える
0

malloc通常、それが返すポインターは任意の型のポインターに変換され、そのような変換は通常 (読み取り: 無限にほぼ 100% の時間) ノーオペレーションであるため、任意の型に対して適切に整列されたメモリを返します。ただし、任意のアーキテクチャとコンパイラの場合、任意の型の最大アラインメントは定数であり、通常はすべてのプリミティブ型のアラインメントの最大値です。ただし、オブジェクトのサイズは、その配置の倍数にする必要があります。オブジェクト内の値にパディングを追加して、この要件を満たす必要がある場合があります。

コンパイラが十分に最新の場合は_Alignof、 と同様にをサポートするsizeofため、小さなプログラムで実際のアライメントを確認できます。あなたのアーキテクチャでは、最大アラインメントは 4 だと思います。malloc常に 8 でアラインされたアドレスを返す場合でも、準拠しています。mallocが型の最大アラインメントの倍数であるアラインメントを満たすことは珍しいことではありません。

于 2013-06-29T13:54:14.300 に答える
0

型のサイズはそのアラインメントの倍数でなければなりませんが (実際のハードウェアによって制限されます)、それらが等しい必要はないことを見逃しています。

の場合long double、これは次のように変換されます。

_Alignof (long double) == 4
sizeof (long double) == 12

gcc/x86 および

_Alignof (long double) == 16
sizeof (long double) == 16

gcc/x64 では、どちらの場合long doubleも 80 ビットの拡張精度があります。

アラインメントによって制限されていなければ、当然のことながら

sizeof (long double) == 10

アラインメントが存在する場合は、アラインメントを 2 にするか (効率上の理由からそうしません)、要素が正しく整列するように配列にパディングを導入する必要があります。これは、配列のサイズがその要素のサイズと数の積であるという C 言語のセマンティクスに違反しています。

于 2013-06-29T15:07:50.350 に答える