C++ 有没有更好的方法来反转内存中的字节数组? typedef无符号字符字节; ... 无效反向字节(无效*开始,整数大小) { 字节*缓冲区=(字节*)(开始); 对于(int i=0;i

C++ 有没有更好的方法来反转内存中的字节数组? typedef无符号字符字节; ... 无效反向字节(无效*开始,整数大小) { 字节*缓冲区=(字节*)(开始); 对于(int i=0;i,c++,memory,swap,std,C++,Memory,Swap,Std,这个方法现在做的是反转内存中的字节。我想知道的是,有没有更好的方法来达到同样的效果?整个“尺寸/2”部分似乎是件坏事,但我不确定 编辑:我刚刚意识到这个问题的标题有多糟糕,所以我[希望]修复了它。标准库有一个功能: typedef unsigned char Byte; ... void ReverseBytes( void *start, int size ) { Byte *buffer = (Byte *)(start); for( int i = 0; i <

这个方法现在做的是反转内存中的字节。我想知道的是,有没有更好的方法来达到同样的效果?整个“尺寸/2”部分似乎是件坏事,但我不确定


编辑:我刚刚意识到这个问题的标题有多糟糕,所以我[希望]修复了它。

标准库有一个功能:

typedef unsigned char Byte;

...

void ReverseBytes( void *start, int size )
{
    Byte *buffer = (Byte *)(start);

    for( int i = 0; i < size / 2; i++ ) {
        std::swap( buffer[i], buffer[size - i - 1] );
    }
}
#包括
无效反向字节(无效*开始,整数大小)
{
char*istart=start,*iend=istart+size;
标准:反向(istart,iend);
}

如果需要反转,则有可能改进算法,只需使用反转迭代器。

如果要反转具有不同endianness的文件中的二进制数据,则可能应该使用ntoh*和hton*函数,它们将指定的数据大小从网络顺序转换为主机顺序,反之亦然。例如,ntohl将一个32位无符号长字符串从大端(网络顺序)转换为主机顺序(x86机器上的小端)。

我将检查stl::swap并确保它得到优化;在那之后,我会说你是空间的最佳人选。我有理由相信这也是最佳时间。

不使用STL的性能解决方案:

#include <algorithm>
void ReverseBytes( void *start, int size )
{
    char *istart = start, *iend = istart + size;
    std::reverse(istart, iend);
}
void reverseBytes(void*start,int size){
无符号字符*lo=开始;
无符号字符*hi=start+size-1;
无符号字符交换;
while(lo

虽然这个问题已经问了3年半了,但有可能其他人也在寻找同样的东西。这就是为什么我仍然发布这篇文章。

谢谢。在我自己写之前,我应该先查一下。对反向函数的描述表明,它的实现方式与提问者的实现方式完全相同,并且它具有相同的复杂性。这不是一个更好的方法。一种更干净的方法也许最好。它用于从使用不同尾数的文件中读取数据。@kitchen,这更像是反转整数的字节,而不是整个数组的字节……您的示例似乎有缺陷,如何在没有位置的情况下交换两个字符?我想你需要把地址传进去。离时间还远着呢。
size/2
计算可能会在每个循环运行之外得到优化,但是
size-i-1
计算不会得到优化,数组索引的成本也不会得到优化。这就是说,一个完美优化的循环不会比他得到的更快。机会已经意识到:)这个问题涉及到交换数组,所以上面提供的解决方案比需要的要具体。或者,如果您使用glib,请参阅
endian.h
void reverseBytes(void *start, int size) {
    unsigned char *lo = start;
    unsigned char *hi = start + size - 1;
    unsigned char swap;
    while (lo < hi) {
        swap = *lo;
        *lo++ = *hi;
        *hi-- = swap;
    }
}