C++ 对齐指针操作
我希望有一个变量,例如int类型的as(对齐为8字节),因此我还希望有8字节的指针操作。(目标指针对齐) 我做了以下几件事,但做不到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_
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支持的所有体系结构。