我想知道是否可以向gcc暗示指针指向对齐的边界。 如果我有一个函数:
void foo ( void * pBuf ) {
uint64_t *pAligned = pBuf;
pAligned = ((pBuf + 7) & ~0x7);
var = *pAligned; // I want this to be aligned 64 bit access
}
而且我知道 pBuf 是 64 位对齐的,有没有办法告诉 gcc pAligned
指向 64 位边界? 如果我这样做:
uint64_t *pAligned __attribute__((aligned(16)));
我相信这意味着指针的地址是 64 位对齐的,但它并没有告诉编译器它指向的内容是对齐的,因此编译器可能会告诉它在这里进行未对齐的获取。 如果我循环访问一个大型数组,这可能会减慢速度。
有几种方法可以通知 GCC 有关对齐的信息。
首先,您可以将对齐属性附加到点,而不是指针:
int foo() {
int __attribute__((aligned(16))) *p;
return (unsigned long long)p & 3;
}
或者你可以使用(相对较新的(内置:
int bar(int *p) {
int *pa = __builtin_assume_aligned(p, 16);
return (unsigned long long)pa & 3;
}
由于对齐,两种变体都优化为return 0
。
不幸的是,以下内容似乎不起作用:
typedef int __attribute__((aligned(16))) *aligned_ptr;
int baz(aligned_ptr p) {
return (unsigned long long)p & 3;
}
而这个也没有
typedef int aligned_int __attribute__((aligned (16)));
int braz(aligned_int *p) {
return (unsigned long long)p & 3;
}
即使文档建议相反。