나는 충분히 크다
std::vector<byte> source
벡터의 오프셋 (예 : 10-13 바이트)에서 4 바이트를 가져와 정수로 변환해야합니다.
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 참조 로 벡터를 전달 하십시오.
int f(const std::vector<std::byte>& v, size_t n)
{
int temp;
memcpy(&temp, v.data() + n, sizeof(int));
return temp;
}
컴파일러는 최적화에 매우 좋습니다. 제 경우에는 GCC의 -O2
결과는 다음 과 같습니다.
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::byte
행이 int
.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다