我需要在复制到另一个数组期间有效地交换数组的字节顺序.
源数组属于某种类型; 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的一个有用的基础,尽管内存带宽可能会浪费时间.
Unix系统具有swab
为16位阵列提供所需功能的功能.它可能已经过优化,但我不确定.请注意,如果您只是编写天真的字节交换代码,现代gcc将生成非常高效的代码:
uint32_t x, y;
y = (x<<24) | (x<<8 & 0xff0000) | (x>>8 & 0xff00) | (x>>24);
Run Code Online (Sandbox Code Playgroud)
即它将使用bswap
i486 +上的指令.大概把它放在一个循环中也会给出一个有效的循环......
编辑:对于您的复制任务,我会在您的循环中执行以下操作:
const uint32_t *src
.uint32_t *dest
.严格地说,这可能不是可移植的(锯齿违规),但只要复制功能在其自己的翻译单元中并且没有内联,就没有什么可担心的.忘掉我写的关于别名的内容; 如果你将数据交换为32位值,它几乎肯定是32位值开始,而不是其他类型的指针,所以没有问题.