我正在写出壮观的功能:
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,所以我不能。
是否有另一种方法来保证编译器的参数地址将被对齐?
备注:
答案 0 :(得分:1)
您可以在GCC / Clang中
int *as_ints = __builtin_assume_aligned(a);
或者如果a
是函数参数,则直接用__attribute((aligned(4)))
进行标记。