gpt4 book ai didi

c++ - GNU GCC 中 `__builtin_assume_aligned` 的类型变体?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:14:41 27 4
gpt4 key购买 nike

GNU 提供了一个函数 void * __builtin_assume_aligned(void *, int) 告诉编译器可以安全地假设函数输入(和返回)的指针由 对齐N 字节。但是,它返回一个 void *,这意味着我必须转换返回的结果,即

float *example = (float *) __builtin_assume_aligned(example_aligned, 64);

float *example = std::reinterpret_cast<float *>
(__builtin_assume_aligned(example_aligned, 64));

这两种感觉都像是 C/C++ 风格的方法(即有人用 C 风格的代码编写 C++)。是否有与 __builtin_assume_aligned 等效的 C++,还是我太挑剔了?

最佳答案

正如 kebno 所建议的,模板包装器可以提供帮助:

template<typename T>
T * assume_aligned(T * p, size_t a, int m = 0)
{
return reinterpret_cast<T *>(__builtin_assume_aligned(p, a, m));
}

此外,它可能仅在 a(和 m?我从未使用过第三个参数)是常量时才有用,这将进一步允许您检查一些不变量:

template<size_t a, int m = 0, typename T>
T * assume_aligned(T * p)
{
static_assert(a >= alignof(T));
static_assert(is_pow2(a));
return reinterpret_cast<T *>(__builtin_assume_aligned(p, a, m));
}

虽然它并没有消除强制转换的需要,但它将范围限制在一个位置。

关于c++ - GNU GCC 中 `__builtin_assume_aligned` 的类型变体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35416001/

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