如何通知编译器指针值应在特定边界对齐



我想知道是否可以向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;
}

即使文档建议相反。

最新更新