다른 배열로 복사하는 동안 배열의 바이트 순서 을 효율적으로 바꿔야합니다.복사 중 바이트 스왑
소스 배열은 특정 유형입니다. char, short 또는 int이므로 필요한 바이트 스왑은 명확하고 해당 유형에 따릅니다.
내 계획은 다중 패스 바이트 단위 복사본 (짧게 2 개, int는 4 개 ...)으로 매우 간단하게 수행하는 것입니다. 그러나 기존의 "memcpy_swap_16/32/64"함수 또는 라이브러리가 있습니까? 아마도 BGR/RGB 이미지 처리를위한 이미지 처리에있을 것입니다.
편집이
내가 개별 값의 바이트를 교환하는 방법을 알고, 그것은 문제가되지 않습니다. 어쨌든 수행 할 사본 중에이 과정을 수행하고 싶습니다..
예를 들어, 배열 또는 리틀 엔디안 4 바이트 정수가있는 경우 4의 바이트 수를 사용하여 0, 1, 2 및 3의 초기 오프셋으로 4 바이트 사본을 수행하여 스왑 할 수 있습니다. 더 나은 방법은 아마도 각 4 바이트 정수를 개별적으로 읽고 바이트 스왑 내장 함수 _byteswap_ushort, _byteswap_ulong 및 _byteswap_uint64를 사용하는 것이 더 빠릅니다. 그러나 이러한 유형의 처리를 수행하는 기존 기능이 있어야한다고 생각합니다. 2
편집 그냥 SSE위한 유용한 근거가 될 수있는이를 발견 메모리 대역폭이 아마 시간의 낭비를 만드는 것이 진정한하지만.
Fast vectorized conversion from RGB to BGRA
컴파일러 바이트 스왑 내장 함수는 올바른 명령어의 사용을 보장하는 더 좋은 방법입니다. 그러나 이것은 문제가 아닙니다. – hplbsh
나는 왜 그걸 "더 나은"것이라고 부를지 모르겠다. 특정 컴파일러에만 한정됩니다. 내가 제공 한 코드는 컴파일러에서 실제로 올바른 작업을하는 "올바른"명령어를 생성합니다. –
최적화되지 않은 디버그 빌드에서도 빠른 속도를 보입니다. – hplbsh