我使用了变体类型而不是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位对齐的? (或者为我可能将此项目移植到的任何架构正确对齐)。
编辑:谢谢大家,但错误在其他地方。显然,英特尔并不真正关心对齐。对齐的东西更快,但不是强制性的,程序运行正常。我的问题是我在写东西之前没有清除数据缓冲区,这给某些类型的构造函数带来了麻烦。但是,我不会将问题标记为已回答,因此更多人可以向我提供有关对齐的提示;)答案 0 :(得分: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;
答案 1 :(得分:0)
我相信
#pragma pack(64)
将适用于所有现代编译器; it definitely works on GCC
更正确的解决方案(不会全局打包)将是:
#pragma pack(push, 64)
// define union here
#pragma pack(pop)