Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对齐指针操作_C++_C_Pointers_Typedef_Memory Alignment - Fatal编程技术网

C++ 对齐指针操作

C++ 对齐指针操作,c++,c,pointers,typedef,memory-alignment,C++,C,Pointers,Typedef,Memory Alignment,我希望有一个变量,例如int类型的as(对齐为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_

我希望有一个变量,例如int类型的as(对齐为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。 我错过什么了吗? 我还发现了以下讨论:
但是没有提供解决方案,也不知道这是否是错误。

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

如果需要控制元素的间距,请使用
并集

union spaced_int
{
    int    i;
    double d;
};
编辑:忽略以下内容,我没有看到减法之前指针被转换到
int

还要注意,减去两个指针总是会产生元素大小的差异,在您的示例中,答案总是
1


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

所以试试这个:

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

对齐说明符只会影响第一个地址,而不会影响地址之间的间距。对于通常需要
\uuuu属性\uuuu(打包)
的数据结构,指针的大小由CPU体系结构和位数(32或64)决定在运行64位操作系统(例如Ubuntu)的64位计算机上,我可以通过传递
-m32
标志将程序编译成32位可执行文件。这台机器在程序中看起来就像是32位的。谢谢。成功了。因此,它仅适用于配备i386 MMX、3DNow的计算机!和SSE扩展?还是通用的c/c++标准?例如,它在arm上工作吗?@RoozbehG我相信
\uuuuuu属性\uuuuu
是编译器特定的扩展,而不是标准的一部分。@RoozbehG它是C的GCC扩展,应该适用于GCC支持的所有体系结构。