gcc 我如何通知编译器一个指针值应该在特定的边界对齐?

zyfwsgd6  于 2023-05-29  发布在  其他
关注(0)|答案(1)|浏览(127)

我想知道是否有可能提示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位对齐的,但它并没有告诉编译器它所指向的是对齐的,因此编译器可能会告诉它在这里做一个非对齐的提取。如果我在一个大数组中循环,这可能会减慢速度。

rxztt3cl

rxztt3cl1#

有几种方法可以通知GCC有关对齐的信息。
首先,你可以将align属性附加到pointee,而不是pointer:

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;
}

尽管医生说的恰恰相反

相关问题