如何向编译器指示指针参数是否已对齐?

时间:2017-03-27 09:04:20

标签: c++ gcc cuda memory-alignment nvcc

我正在写出壮观的功能:

void foo(void* a) {
    if (check_something_at_runtime_only()) {
        int* as_ints { a };
        // do things with as_ints
    }
    else {
        char* as_chars { a };
        // do things with as_chars
    }
}

现在,我们知道使用as_ints的一些工作将从它更好地协调中受益;例如如果我的平台上的内存事务大小是N个字节,那么我可以用一个机器指令读取第一个N / sizeof(int)元素(这里忽略SIMD /矢量化) - 提供a是N字节对齐的

现在,我可以通过让foo始终采用int *来指示对齐 - 至少在只能从对齐地址读取较大类型的平台上 - 但我宁愿保留类型{{ 1}},因为它不一定是void *的数组,真的。

我希望能够写出像

这样的东西
int

但显然是alignas doesn't apply to pointers,所以我不能。

是否有另一种方法来保证编译器的参数地址将被对齐?

备注:

  • 我对C ++标准(任何版本)允许的内容以及GCC,clang和NVCC(CUDA编译器)中特定于编译器的扩展感兴趣。

1 个答案:

答案 0 :(得分:1)

您可以在GCC / Clang中

int *as_ints = __builtin_assume_aligned(a);

或者如果a是函数参数,则直接用__attribute((aligned(4)))进行标记。