我正在写一个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测试),而且我并不关心性能,所以我不应该有任何问题。
我是否为自己做好准备?
编辑:我在这里假设"双指针"指的是指向双精度的指针,而不是指针的指针,因为它似乎是某些地方的非正式约定。 FWIWR_alloc
(src/main/memory.c@~2700)中的代码想要分配sizeof(VECREC)
的倍数,其中VECREC
是union(SEXP, double)
(src / include / Defn.h@~410),加上标题偏移量。据推测,这是双打的对齐保证所在,但我不确定为什么这对于较大的结构来说会是一个问题。当然,我对此并不是特别有经验。
答案 0 :(得分:0)
我仍然不是这方面的专家,但至少根据this site:
通常,struct实例将具有其最宽的标量成员的对齐方式。编译器这样做是确保所有成员自我对齐以便快速访问的最简单方法。
所以在这种情况下,结构应该具有与R_alloc
分配的对齐,因为它的最大成员将是SEXP
(可能,我想它可能是char *
在某些系统上更大,但似乎不太可能),R_alloc
以union(SEXP, double)
的倍数分配,如问题中所述。
另一件值得指出的事情是,结构中元素的推荐排序是从最大的对齐要求到最低的,现在我们从int
开始,这是最小的。