Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 复制期间的字节交换_C++_C_Memory - Fatal编程技术网

C++ 复制期间的字节交换

C++ 复制期间的字节交换,c++,c,memory,C++,C,Memory,在复制到另一个数组的过程中,我需要有效地交换数组的字节顺序 源阵列属于某一类型;char、short或int,因此所需的字节交换是明确的,并且将根据该类型进行 我的计划是非常简单地使用一个多通道字节复制(2代表缩写,4代表int,…)。但是,是否存在任何预先存在的“memcpy_swap_16/32/64”函数或库?可能在图像处理中用于BGR/RGB图像处理 编辑 我知道如何交换单个值的字节,这不是问题。我希望在我将要执行的复制过程中执行此过程 例如,如果我有一个数组或小尾端4字节整数,我可以通

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

源阵列属于某一类型;char、short或int,因此所需的字节交换是明确的,并且将根据该类型进行

我的计划是非常简单地使用一个多通道字节复制(2代表缩写,4代表int,…)。但是,是否存在任何预先存在的“memcpy_swap_16/32/64”函数或库?可能在图像处理中用于BGR/RGB图像处理

编辑

我知道如何交换单个值的字节,这不是问题。我希望在我将要执行的复制过程中执行此过程

例如,如果我有一个数组或小尾端4字节整数,我可以通过执行4个字节复制,初始偏移量为0、1、2和3,步长为4来交换它们。但是可能有更好的方法,甚至可以单独读取每个4字节整数,并使用字节交换内部函数&u byteswap\u ushort、\u byteswap\u ulong和\u byteswap\u uint64会更快。但是我怀疑一定有一些现有的函数可以进行这种类型的处理

编辑2

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


Unix系统有一个
swab
功能,可以满足16位阵列的需要。它可能已经优化了,但我不确定。请注意,如果您只编写简单的字节交换代码,现代gcc将生成极其高效的代码:

uint32_t x, y;
y = (x<<24) | (x<<8 & 0xff0000) | (x>>8 & 0xff00) | (x>>24);
uint32_t x,y;
y=(x24);
i、 e.它将在i486+上使用
bswap
指令。大概把它放在一个循环中也会得到一个有效的循环

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

  • constuint32\u t*src
    读取32位值
  • 使用上面的代码交换它
  • 将32位值写入
    uint32\u t*dest

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

    在linux中,您应该检查头
    位/byteswap.h
    。有一系列bswap###形式的宏,其中一些在适当的情况下使用汇编指令。

    是的,有一些现有函数,如问题中链接的函数,但不值得付出努力,因为数据的大小(在本例中)意味着设置开销太大。因此,最好一次读取2、4和8个字节,并使用内部函数进行交换和写回。

    这个头,就像写的一样,是一个讨厌的东西。他们使用内联程序集使其“快速”,然后当参数是常量时,gcc扩展支持C而不是程序集,以便gcc可以折叠常量。但是——如果不是那么令人伤心的话,这里有一点让人觉得很有趣——如果你像我在回答中写的那样编写简单的C,gcc将自己生成相同或更好的asm。@R。它包含16、32、64位实现,并正确处理32/64位系统。并使其简单到
    bswap_16(…)
    。我同意这些函数很有用。我只是说标题写得很糟糕。如果所有内联asm和gcc扩展都从中剥离出来,那么生成的代码将同样好或更好,错误和不兼容的可能性将几乎消除。此外,清理它将有助于教导新手不要过早地进行优化……编译器字节交换内部函数是保证使用正确指令的更好方法。但这不是问题所在。我不知道你为什么叫他们“更好”。它们是特定于特定编译器的。我给出的代码将在任何实际需要优化的编译器上生成“正确”的指令。因为即使在未优化的调试版本中,它也会很快。同意分块复制,因为它可以减少内存访问。关闭调试优化应该只是最后的手段,而不是标准做法。实际上,关闭优化往往会隐藏bug,因为C代码中的大部分bug都来自于调用未定义的行为,这些行为可能会通过将C简单地转换为机器代码而产生“正确”的行为,但真正的优化编译器会产生严重的bug。