2011-06-21 17 views
2

C、C++内の構造体またはクラス内のパディングを計算する方法に関する情報が見つかりません。構造体/クラスデータの整列とパディングのアルゴリズムですか?

HLSLには、「定数変数」と呼ばれるデータ構造があり、それは#pragma pack (4)を有効にしたC構造体に非常によく似ています。 HLSLの定数変数に関する詳細はHere is a linkを参照してください。

私が抱えている問題は、構造体フォーマット記述子を作成しようとすることです。 HLSLコードを解析した後、定数記述子には定数変数structに含まれるデータ型に関する情報が含まれます。各メンバ変数のデータ型、オフセット、構造体の合計サイズを記述します。私が抱えている問題は、パディングのために構造体の最終サイズを決定することです。

これのアルゴリズムがあれば、それをコード化して、HLSLの「定数変数」の実際の埋め込みサイズを計算できるはずです。問題は私がそれが何であるかを知らず、どこにそれを見つけるべきかも分かっていないのですか?

+0

あなたのやりたいことははっきりしません。あなたは "実際の詰め物の大きさ"を知りたいと言っていますが、次にsizeofの何が問題なのですか? –

+0

実行時またはコンパイル時にこれを実行しようとしていますか?または、HLSLを処理し、HLSL定数の適切な埋め込みを持つC/C++オブジェクトを生成するツールを作成しようとしていますか? –

+0

コンパイラを使って理解してみませんか? sizeofキーワード、offsetof()マクロ、およびコンパイラがサポートする#pragmaを使用して、パッキングを変更します。 #pragma packはMSVCでサポートされています。 –

答えて

1

私の質問は、#pragma pack 4の作業に使用されるアルゴリズムを尋ねています。 (例えば、それは、構造体の中に一度に一つの変数を見て、どこにパッドを決定するために最大サイズのテストのいくつかの並べ替えを使用するか、それが周りstruct全体何とかシャッフルデータを分析んん。)

コンパイラをすることができませんデータをCスタイルの構造体でシャッフルします。 Cはメンバーが宣言された順番で割り当てられることを保証します。任意のパディングは、メンバー間または構造体の最後に来る必要があります。

アクセス指定子を持つC++クラスは、Cと互換性がある必要はないため、いくつかの並べ替えが可能です。

関連する問題