gpt4 book ai didi

c++ - 将 8 个 uint8_t 组合成一个 uintmax_t 的最快方法是什么?

转载 作者:搜寻专家 更新时间:2023-10-31 01:30:00 25 4
gpt4 key购买 nike

我正在寻找优化一段代码,它使用 popcnt 来计算 uint8_t 之间的差异。我认为将 8 个 uint8_t 组合成一个 uintmax_t 并改用 popcnt64 会更快,这样 popcnt 操作就没有了被称为超过必要的 8 倍。将 8 个 uint8_t 送入 popcnt64 的最快方法是什么?我可以使用某种铸件吗?我应该使用位操作吗?我不知道 C++ 的内部工作原理,所以我不确定进行这种转换的最快方法是什么。

最佳答案

假设您不关心字节序——您只想处理 uint8_t作为 uint64_t你不关心 uint8_t 的顺序s – 那么你可以使用 std::memcpy 进行类型双关:

std::uint64_t combine(std::array<std::uint8_t, 8> b) {
static_assert(sizeof(b) == sizeof(std::uint64_t));
static_assert(std::is_trivially_copyable_v<std::uint64_t>);
static_assert(std::is_trivially_copyable_v<decltype(b)>);

std::uint64_t result;
std::memcpy(&result, b.data(), sizeof(result));
return result;
}

generated assembly只返回参数:

combine(std::array<unsigned char, 8ul>): # @combine(std::array<unsigned char, 8ul>)
mov rax, rdi
ret

使用任何其他类型双关使得您不得不担心严格的别名规则或类型对齐。只需使用 std::memcpy 就足够简单了让编译器去处理


请注意,调用 popcnt 的任何变体的最简单方法来自 C++ 的是使用 std::bitset::count .所以而不是 __builtin_popcountll(my_u64)__popcnt64(my_u64) ,你可以只写 std::bitset<64>{my_u64}.count()您会立即获得可移植代码。

关于c++ - 将 8 个 uint8_t 组合成一个 uintmax_t 的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48775192/

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