0

私には奇妙に見える何かに気づきました。Visual C++ は、既定ではオブジェクトを必要な境界に揃えません。たとえば、long long は 4 バイト境界に整列されますが、__alignof(T) は 8 を返します (私が見る限り、常に型のサイズを返します)。そのため、正しく配置されていないように見えます。例えば

long long a1;
char g;
long long a2;
// alignment check for &a2 fails
if (((uintptr_t)&a2 & (__alignof(long long) - 1)) != 0) // failed

また、ポインターを印刷しようとしました。値&a20x0035F8FC353714810進数)です。

何か間違っていますか?long long 型の適切に配置されたオブジェクトが必要です。それについて私は何ができますか?Microsoft の拡張機能を使用することもできます__declspec(align())が、リテラル番号が必要なので、そのようなものを書くことはできません。

__declspec(align(__alignof(long long))) long long object;
4

2 に答える 2

2

VC は、変数の自動スタック アラインメントを保証しません。多くても、変数はスタック アラインメント (通常、32 ビット システムでは 4 バイト) にアラインされます。特別なアラインメントが必要な場合は__declspec(align(x))、MSVC の SSE タイプ ( など__m128) と同様に を使用する必要があります。それ以外の場合は、_aligned_malloc代わりに使用する必要があります。

于 2011-02-16T07:30:32.807 に答える
0

アラインメントにより、RAMアクセスのメモリサイクルを最小限に抑える必要があります。4バイトのアラインメントは、に2つの32ビットアクセスのみを使用します long long。8バイトのアラインメントは動作を改善しません。コンパイラには、オプションで上書きできるデフォルトの配置があり/Zpます。

参照:構成プロパティC /C++コード生成構造体メンバーの配置。

于 2011-02-16T07:12:32.697 に答える