R_alloc和对齐注意事项

时间:2017-08-24 13:42:09

标签: c r memory-alignment

我正在写一个R扩展,要求我为结构数组分配内存。结构包含整数,SEXP,字符指针,例如类似的东西:

struct my_struct {
  int a;
  SEXP b;
  const char * d;
  const char * e[3];
};

我希望使用类似的东西为数组分配内存:

struct my_struct * arr = (struct my_struct *) R_alloc(10, sizeof(my_struct));

这在最严格的意义上有效,但我在WRE的以下评论中暂停了:

  

返回的内存只能保证按双指针的要求对齐:在投射到需要更多的指针时采取预防措施。

我并不关心速度或空间,因为我不希望我的阵列很大或频繁访问。但我想避免崩溃。我的理解是,未对齐的内存访问实际上只是x86架构的性能问题。此外,由于现在似乎R主要用于x86架构(基于CRAN测试),而且我并不关心性能,所以我不应该有任何问题。

我是否为自己做好准备?

编辑:我在这里假设"双指针"指的是指向双精度的指针,而不是指针的指针,因为它似乎是某些地方的非正式约定。 FWIW R_alloc(src/main/memory.c@~2700)中的代码想要分配sizeof(VECREC)的倍数,其中VECRECunion(SEXP, double)(src / include / Defn.h@~410),加上标题偏移量。据推测,这是双打的对齐保证所在,但我不确定为什么这对于较大的结构来说会是一个问题。当然,我对此并不是特别有经验。

1 个答案:

答案 0 :(得分:0)

我仍然不是这方面的专家,但至少根据this site

  

通常,struct实例将具有其最宽的标量成员的对齐方式。编译器这样做是确保所有成员自我对齐以便快速访问的最简单方法。

所以在这种情况下,结构应该具有与R_alloc分配的对齐,因为它的最大成员将是SEXP(可能,我想它可能是char *在某些系统上更大,但似乎不太可能),R_allocunion(SEXP, double)的倍数分配,如问题中所述。

另一件值得指出的事情是,结构中元素的推荐排序是从最大的对齐要求到最低的,现在我们从int开始,这是最小的。