gpt4 book ai didi

c++ - C++:从vector 的任何位置获取int

转载 作者:行者123 更新时间:2023-12-03 07:07:05 27 4
gpt4 key购买 nike

我足够大

std::vector<byte> source
我需要从 vector 的任何偏移量中获取4个字节(例如10-13个字节),并将其转换为整数。
int ByteVector2Int(std::vector &source, int offset)
{
return (source[offset] | source[offset + 1] << 8 | source[offset + 2] << 16 | source[offset + 3] << 24);
}
这种方法称为“太过分”,我该如何以最佳性能做到这一点?

最佳答案

使用memcpy。您可能会想使用reinterpret_cast,但是随后您很容易遇到未定义的行为(例如,由于对齐问题)。另外,通过const引用传递 vector :

int f(const std::vector<std::byte>& v, size_t n)
{
int temp;
memcpy(&temp, v.data() + n, sizeof(int));
return temp;
}
请注意,编译器在优化方面非常出色。在我的情况下,带有 -O2的GCC导致:
mov     rax, qword ptr [rdi]
mov eax, dword ptr [rax + rsi]
ret
因此,没有 memcpy调用,并且汇编是最小的。现场演示: https://godbolt.org/z/oWGqej

更新(基于问题更新)
编辑后,您可能还会注意到生成的程序集与您的方法完全相同(就我而言):
int f2(const std::vector<std::byte>& v, size_t n)
{
return (int)(
(unsigned int)v[n]
+ ((unsigned int)v[n + 1] << 8)
+ ((unsigned int)v[n + 2] << 16)
+ ((unsigned int)v[n + 3] << 24) );
}

现场演示: https://godbolt.org/z/c9dE9W
请注意,您的代码 不正确。首先,使用溢出的 std::byte执行按位运算,其次,不存在从 std::byteint的隐式转换。

关于c++ - C++:从vector <byte>的任何位置获取int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64711991/

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