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