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

How can I indicate to the compiler that a pointer parameter is aligned?

我正在编写壮观的函数:

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/vectorization)——前提是 a 是 N-字节对齐。

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

我希望能够写出类似

的东西
void foo(alignas(sizeof(int)) void* a) { ... }

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

除了参数地址对齐之外,还有其他方法可以向编译器保证吗?

备注:

在GCC/Clang你可以做到

int *as_ints = __builtin_assume_aligned(a);

或者如果a是函数参数直接用__attribute((aligned(4)))标记即可。

在 C++20 中你可以使用 std::assume_aligned:

#include <memory>

int *as_ints = std::assume_aligned<sizeof(int)>(a);