gpt4 book ai didi

c++ - 复制期间的字节交换

转载 作者:IT王子 更新时间:2023-10-28 23:35:38 33 4
gpt4 key购买 nike

我需要在复制到另一个数组时有效地交换数组的字节顺序

源数组是某种类型的; char、short 或 int,因此所需的字节交换是明确的,并且将根据该类型。

我的计划是非常简单地使用多遍逐字节复制(简称为 2,为 int 为 4,...)。但是,是否有任何预先存在的“memcpy_swap_16/32/64”函数或库?也许在 BGR/RGB 图像处理的图像处理中。

编辑

我知道如何交换单个值的字节,这不是问题。我想在我将要执行的拷贝期间执行此过程

例如,如果我有一个数组或 little endian 4 字节整数,我可以通过执行 4 个字节复制来交换它们,初始偏移量为 0、1、2 和 3,步长为 4。但可能存在更好的方法,甚至可能单独读取每个 4 字节整数并使用字节交换内在函数 _byteswap_ushort、_byteswap_ulong 和 _byteswap_uint64 会更快。但我怀疑肯定存在执行此类处理的现有函数。

编辑 2

刚刚发现这个,这可能是 SSE 的有用基础,尽管内存带宽确实可能会浪费时间。

Fast vectorized conversion from RGB to BGRA

最佳答案

Unix 系统有一个 swab 函数,可以为 16 位数组执行您想要的操作。它可能已优化,但我不确定。请注意,如果您只编写简单的字节交换代码,现代 gcc 将生成极其高效的代码:

uint32_t x, y;
y = (x<<24) | (x<<8 & 0xff0000) | (x>>8 & 0xff00) | (x>>24);

即它将使用 i486+ 上的 bswap 指令。大概把它放在一个循环中也会产生一个有效的循环......

编辑:对于您的复制任务,我会在您的循环中执行以下操作:

  1. const uint32_t *src 读取 32 位值。
  2. 使用上面的代码进行交换。
  3. 将 32 位值写入 uint32_t *dest

严格来说,这可能不是可移植的(别名冲突),但只要复制功能在它自己的翻译单元中并且没有被内联,就没什么好担心的了。 忘记我写的关于混叠;如果您将数据交换为 32 位值,那么几乎可以肯定它实际上是 32 位值,而不是其他类型的指针,所以没有问题。

关于c++ - 复制期间的字节交换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7342527/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com