Ho bisogno di scambiare in modo efficiente l'ordine dei byte di un array durante la copia in un altro array.Byte swap durante la copia
L'array di origine è di un certo tipo; char, short o int così lo scambio di byte richiesto non è ambiguo e sarà secondo quel tipo.
Il mio piano è quello di fare questo molto semplicemente con una copia byte-saggio multi-pass (2 in breve, 4 per int, ...). Esistono comunque delle funzioni o librerie "memcpy_swap_16/32/64" preesistenti? Forse nell'elaborazione delle immagini per l'elaborazione di immagini BGR/RGB.
EDIT
so come scambiare i byte di valori individuali, che non è il problema. Voglio fare questo processo durante una copia che eseguirò comunque.
Ad esempio, se si dispone di un array o di piccoli numeri interi endian a 4 byte, è possibile effettuare uno scambio eseguendo copie a 4 byte con offset iniziale di 0, 1, 2 e 3 con un passo di 4. Tuttavia, potrebbero esserci un modo migliore, forse anche leggendo ogni intero di 4 byte individualmente e utilizzando gli intrinsecamente byte-swap _byteswap_ushort, _byteswap_ulong e _byteswap_uint64 sarebbe più veloce. Ma sospetto che ci siano funzioni esistenti che eseguono questo tipo di elaborazione.
EDIT 2
appena trovato questo, che può essere una base utile per SSE, anche se è vero che la larghezza di banda della memoria, probabilmente lo rende una perdita di tempo.
Fast vectorized conversion from RGB to BGRA
I byte del compiler swap intrinsics sono un modo migliore per garantire l'uso dell'istruzione corretta. Ma questo non è il problema. – hplbsh
Non so perché li chiameresti "migliori". Sono specifici per un particolare compilatore. Il codice che ho dato genererà l'istruzione "corretta" su qualsiasi compilatore che in realtà si preoccupa di ottimizzare. –
Perché sarà veloce anche nelle build di debug non ottimizzate. – hplbsh