对齐指针操作

时间:2014-05-01 03:32:41

标签: c++ c pointers typedef memory-alignment

我想要一个变量,例如int类型(对齐为8个字节),所以我也希望对它进行8字节的指针操作。 (目标指针对齐)

我做了以下但是无法做到。

typedef int int_align_double __attribute__ ((aligned(sizeof(double))));
typedef int_align_double* pint_align_double;
pint_align_double pint;

typedef int_align_double* pint_align_double __attribute__ ((aligned(sizeof(double))));

那样

(int)&pint[1]-(int)&pint[0] == 8

但它等于4。 我错过了什么吗? 我也发现了这个讨论:http://gcc.gnu.org/ml/gcc/2010-01/msg00005.html 但没有提供解决方案或是否是一个错误。

2 个答案:

答案 0 :(得分:3)

对齐说明符将影响数组的第一个元素的对齐,但它不会影响数组中元素的间距。

如果您需要控制元素的间距,请使用union

union spaced_int
{
    int    i;
    double d;
};

编辑:忽略以下内容,我没有看到指针在减法之前被转换为int

  

另请注意,减去两个指针总会产生元素大小的差异,在您的示例中,答案始终为1

答案 1 :(得分:3)

您应该使用属性vector_size,它以字节为单位指定变量的向量大小,而不是aligned

所以试试这个:

typedef int int_align_double __attribute__ ((vector_size(sizeof(double))));