0

boost::variantの代わりに使用するバリアント型を作成しました。Mineは、可能なタイプのリストに現在のタイプのインデックスを格納し、最大のタイプを格納するのに十分なスペースがあるバイト配列にデータを格納するように機能します。

unsigned char data[my_types::max_size];
int type;

さて、このバリアント型に値を書き込むと、問題が発生します。私は以下を使用します:

template<typename T>
void set(T a) {
   int t = type_index(T);
   if (t != -1) {
      type = t;
      puts("writing atom data");
      *((T *) data) = a; //THIS PART CRASHES!!!!
      puts("did it!");
    } else {
      throw atom_bad_assignment;
    }
}

クラッシュする行は、データを内部バッファに格納する行です。ご覧のとおり、バイト配列を目的の型のポインターに直接キャストしています。これにより、いくつかの値を書き込もうとすると、アドレス信号が不良になり、バスエラーが発生します。

64ビットシステムでGCCを使用しています。配列のアドレスが64ビットで整列されていることを確認するために、バイト配列の整列を設定するにはどうすればよいですか?(または、このプロジェクトを移植する可能性のあるアーキテクチャに合わせて適切に調整します)。

編集:ありがとうございましたが、間違いはどこかにありました。どうやら、Intelは実際にはアライメントを気にしていないようです。整列されたものはより高速ですが必須ではなく、プログラムはこのように正常に動作します。私の問題は、何かを書く前にデータバッファーをクリアしなかったため、一部のタイプのコンストラクターで問題が発生したことです。ただし、質問に回答済みのマークを付けないので、より多くの人が調整のヒントを教えてくれます;)

4

2 に答える 2

1

http://gcc.gnu.org/onlinedocs/gcc-4.0.4/gcc/Variable-Attributes.htmlを参照してください

unsigned char data[my_types::max_size] __attribute__ ((aligned));
int type;
于 2011-03-24T02:33:42.567 に答える
0

私は信じている

#pragma pack(64)

最新のすべてのコンパイラで動作します。それは間違いなくGCCで動作します。

より正しい解決策(グローバルにパッキングを混乱させない)は次のようになります:

#pragma pack(push, 64)
// define union here
#pragma pack(pop)
于 2011-03-24T02:32:42.500 に答える