1

Interlocked* 関数呼び出しで使用されるメンバーを持つクラスを持つレガシー コードがいくつかあります。

私が持っているいくつかのメンバー変数が 4 バイト境界に配置されていることを確認したい (InterlockedIncrement で使用するには、http://blogs.msdn.com/b/oldnewthing/archive/2004/08/30/222631.aspxを参照) .

VS 2010 の構造体メンバーのデフォルトのアラインメントを指定する決定的なものは見つかりません。実験的に、デフォルトのパッキングを変更せずに構造体を 4 バイト アラインメントに違反させることはできませんでした。私が知ることができたのは、デフォルトのパッキングが 8 バイトであり、どこでもそれを使用していることだけです。

http://blogs.msdn.com/b/oldnewthing/archive/2004/08/30/222631.aspx

私が知りたいのは、Interlocked* 呼び出しで使用されるすべての変数に __declspec(align(4)) を追加する必要があるかということです。

編集:パッキングとその方法について知っています。具体的でなくてすみません。また、CRT はすべての構造体を割り当て、デフォルトで 8 バイトのパッキングが与えられた場合、すべての構造体メンバーがデフォルトで 4 バイト境界に整列されるようにしますか?

32 ビットの int 静的変数はデフォルトで整列されますか? VS に関するドキュメントを探していますが、デフォルトを説明するドキュメントを見つけるのに苦労しています。

4

3 に答える 3

0

プロジェクト設定で構造体メンバーの配置を直接変更できます。このオプションは「構造体メンバーの配置」と呼ばれます。4バイトに設定するだけです。

http://msdn.microsoft.com/en-us/library/xh3e3fd0.aspx

プロジェクトの[プロパティページ]ダイアログボックスを開きます。詳細については、「方法:プロジェクトを開く>プロパティページ」を参照してください。

C /C++フォルダーをクリックします。

[コード生成]プロパティページをクリックします。

StructMemberAlignmentプロパティを変更します。

于 2011-08-04T21:00:00.330 に答える
0

http://msdn.microsoft.com/en-us/library/83ythb65.aspxに従って __declspec(align()) を使用できます。これは、構造体の個々のメンバーで使用できます。上のリンクの最後の例を参照してください。

于 2011-08-05T01:07:55.220 に答える
0

You can specify the packing for an entire structure by using the #pragma pack directive.

#pragma pack(4)
struct MyStruct 
{
  ...
};
#pragma pack()  // this reset the packing to default
于 2011-08-04T20:47:43.780 に答える