如何向编译器指示指针参数已对齐?
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,所以我不能。
除了参数地址对齐之外,还有其他方法可以向编译器保证吗?
备注:
- 我对 C++ 标准(任何版本)允许的内容以及 GCC、clang 和 NVCC(CUDA 编译器)中特定于编译器的扩展感兴趣。
在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);
我正在编写壮观的函数:
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,所以我不能。
除了参数地址对齐之外,还有其他方法可以向编译器保证吗?
备注:
- 我对 C++ 标准(任何版本)允许的内容以及 GCC、clang 和 NVCC(CUDA 编译器)中特定于编译器的扩展感兴趣。
在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);