变体类型存储和对齐问题

时间:2011-03-24 02:28:05

标签: variant memory-alignment

我使用了变体类型而不是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位对齐的? (或者为我可能将此项目移植到的任何架构正确对齐)。

编辑:谢谢大家,但错误在其他地方。显然,英特尔并不真正关心对齐。对齐的东西更快,但不是强制性的,程序运行正常。我的问题是我在写东西之前没有清除数据缓冲区,这给某些类型的构造函数带来了麻烦。但是,我不会将问题标记为已回答,因此更多人可以向我提供有关对齐的提示;)

2 个答案:

答案 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)
相关问题