gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:15:33 25 4
gpt4 key购买 nike

我正在编写壮观的函数:

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 * 来指示对齐 - 至少在只能从对齐地址读取较大类型的平台上 - 但我宁愿保留 void * 类型,因为它不一定是 int 数组,真的。

我希望能够写出类似的东西

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

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

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

注意事项:

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

最佳答案

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

#include <memory>

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

关于c++ - 如何向编译器指示指针参数已对齐?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43042120/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com