C ++ : vector <byte>의 모든 위치에서 int 가져 오기

Jaanq

나는 충분히 크다

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);
}

이 방법은 너무 공격적이라고합니다. 어떻게 최대 성능으로이를 수행 할 수 있습니까?

Daniel Langr

사용 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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

C ++에서 <pair <int, int>, int *> 형식의 맵의 모든 키 가져 오기

분류에서Dev

C ++의 char *에서 C #의 byte [] 가져 오기

분류에서Dev

C #에서 컨트롤의 모든 이벤트 가져 오기

분류에서Dev

PrintDialog에 대한 C #의 모든 PrintQueue 목록 가져 오기

분류에서Dev

하위 목록의 요소에서 모든 쌍 가져 오기

분류에서Dev

C ++ 텍스트 파일의 데이터를 int Vector로 가져 오기

분류에서Dev

C ++에서 다차원 배열 요소의 모든 조합 가져 오기

분류에서Dev

C ++ 하위 현재 디렉토리의 모든 exe 파일 가져 오기

분류에서Dev

파이썬에서 ndarray의 모든 요소에서 n 위치에 비트 가져 오기

분류에서Dev

tar의 -C 지정 폴더에있는 모든 파일 가져 오기

분류에서Dev

장고의 내 모델에서 모든 열 가져 오기

분류에서Dev

c # LINQ : 모델에서 모든 정수 가져 오기

분류에서Dev

Mongo 지정된 위치에서 10 마일 이내의 모든 문서 가져 오기

분류에서Dev

Swift의 String에서 Int 가져 오기

분류에서Dev

GIT 브랜치에서 생성 된 모든 브랜치 목록을 얻는 방법 (브랜치의 모든 하위 브랜치 가져 오기)

분류에서Dev

심포니에서 모든 달의 기록 가져 오기

분류에서Dev

모든 div에서 위치 가져 오기

분류에서Dev

Android-모든 수업에서 위치 가져 오기

분류에서Dev

IEx의 모든 엘릭서 모듈 목록 가져 오기

분류에서Dev

C # (Unity)의 모든 JSON 키 및 값 가져 오기

분류에서Dev

Regex C #-텍스트의 모든 항목 가져 오기

분류에서Dev

GeoFire의 특정 범위 내의 모든 개체 가져 오기

분류에서Dev

모든 픽셀 위치 가져 오기

분류에서Dev

Java에서 JSON 문자열 JsonNode의 모든 키 가져 오기

분류에서Dev

루프에서 객체의 모든 필드 값 가져 오기

분류에서Dev

Android의 WebView에서 모든 이미지 가져 오기

분류에서Dev

PHP 파일의 모든 배열 var에서 값 가져 오기

분류에서Dev

NSArray에서 NSFetchRequest의 모든 결과 가져 오기

분류에서Dev

텍스트 줄에서 bash의 모든 변수 가져 오기

Related 관련 기사

  1. 1

    C ++에서 <pair <int, int>, int *> 형식의 맵의 모든 키 가져 오기

  2. 2

    C ++의 char *에서 C #의 byte [] 가져 오기

  3. 3

    C #에서 컨트롤의 모든 이벤트 가져 오기

  4. 4

    PrintDialog에 대한 C #의 모든 PrintQueue 목록 가져 오기

  5. 5

    하위 목록의 요소에서 모든 쌍 가져 오기

  6. 6

    C ++ 텍스트 파일의 데이터를 int Vector로 가져 오기

  7. 7

    C ++에서 다차원 배열 요소의 모든 조합 가져 오기

  8. 8

    C ++ 하위 현재 디렉토리의 모든 exe 파일 가져 오기

  9. 9

    파이썬에서 ndarray의 모든 요소에서 n 위치에 비트 가져 오기

  10. 10

    tar의 -C 지정 폴더에있는 모든 파일 가져 오기

  11. 11

    장고의 내 모델에서 모든 열 가져 오기

  12. 12

    c # LINQ : 모델에서 모든 정수 가져 오기

  13. 13

    Mongo 지정된 위치에서 10 마일 이내의 모든 문서 가져 오기

  14. 14

    Swift의 String에서 Int 가져 오기

  15. 15

    GIT 브랜치에서 생성 된 모든 브랜치 목록을 얻는 방법 (브랜치의 모든 하위 브랜치 가져 오기)

  16. 16

    심포니에서 모든 달의 기록 가져 오기

  17. 17

    모든 div에서 위치 가져 오기

  18. 18

    Android-모든 수업에서 위치 가져 오기

  19. 19

    IEx의 모든 엘릭서 모듈 목록 가져 오기

  20. 20

    C # (Unity)의 모든 JSON 키 및 값 가져 오기

  21. 21

    Regex C #-텍스트의 모든 항목 가져 오기

  22. 22

    GeoFire의 특정 범위 내의 모든 개체 가져 오기

  23. 23

    모든 픽셀 위치 가져 오기

  24. 24

    Java에서 JSON 문자열 JsonNode의 모든 키 가져 오기

  25. 25

    루프에서 객체의 모든 필드 값 가져 오기

  26. 26

    Android의 WebView에서 모든 이미지 가져 오기

  27. 27

    PHP 파일의 모든 배열 var에서 값 가져 오기

  28. 28

    NSArray에서 NSFetchRequest의 모든 결과 가져 오기

  29. 29

    텍스트 줄에서 bash의 모든 변수 가져 오기

뜨겁다태그

보관