1

C99では、新しい複合型が定義されました。私は、コンパイラがこの知識をメモリアクセスの最適化に利用できるかどうかを理解しようとしています。タイプのこれらのオブジェクト(A- F)はcomplex float、メモリ内で8バイトに整列されることが保証されていますか?


#include "complex.h"
typedef complex float cfloat;

cfloat A;
cfloat B[10];

void func(cfloat C, cfloat *D)
{
    cfloat E;
    cfloat F[10];
}

の場合、質問は、ポインタストレージ自体ではなく、が指すDオブジェクトに関連していることに注意してください。Dそして、それが整列されていると想定される場合、渡されたアドレスが実際の複合体であり、別の(8整列されていない)タイプからのキャストではないことをどのように確認できますか?

D更新1:私はおそらくポインタに関する最後のコメントで自分自身に答えました。B / c関数呼び出しのパラメーターに割り当てられるアドレスを知る方法はなく、8方向に整列されることを保証する方法もありません。これは__builtin_assumed_aligned()関数を介して解くことができます。

他の変数については、まだ疑問が残ります。

更新2:フォローアップの質問をここに投稿しました。

4

1 に答える 1

2

Afloat complexは、2 つの配列と同じメモリ レイアウトとアラインメントを持つことが保証されていますfloat(§6.2.5)。そのアライメントが正確にどうなるかは、コンパイラまたはプラットフォームによって定義されます。確かに言えることは、 afloat complex少なくとも a と同じくらい整列しているということfloatです。

それが整列されていると想定されている場合、渡されたアドレスが実際の複合体であり、別の (非 8 整列) 型からのキャストではないことをどのように確認できますか?

呼び出し元がアラインメントが不十分なポインターを渡した場合、それは未定義の動作であり、コードのバグです (§6.3.2.3)。それをサポートする必要はありません (ただし、選択することはできます)。

于 2012-06-07T14:18:11.407 に答える