字节交换方面的一般交换实现

General swap implementation in terms of byte swap

标准库中通用交换的当前实现类似于

template <class T>
void swap(T& a, T& b) {
  T c(move(a));
  a = move(b);
  b = move(c);
}

我想知道我是否可以改为执行以下操作。

template <class T>
void swap(T& a, T& b) {
  unsigned char x;
  auto pa = reintepret_cast<unsigned char*>(&a);
  auto pb = reintepret_cast<unsigned char*>(&b);
  auto pc = pa + sizeof(a);
  while (pa != pc) {
    x = *pa;
    *pa = *pb;
    *pb = x;
    ++pa, ++pb;
  }
}

我认为这个实现在 space 用法方面更好,因为它只需要一个字节。

交换 类 时需要解决许多注意事项。对于 POD 类型,交换字节可以正常工作。然而,更复杂的 类 可能依赖于字节交换不遵守的不变量。例如,考虑对成员变量的引用:

struct Foo {
    Foo() : bar{}, barRef{bar} {};
    int  bar;
    int& barRef; // Expected to refer to the neighboring `bar`
};

int main()
{
    Foo f{};
    {
        Foo g{};
        byte_swap(f, g);
    }
    // `f` is now invalid: `f.barRef` is pointing to garbage
}

你必须考虑到每个 class 都可以定义当一个实例被它自己复制或移动时应该发生什么。有时 class 可能会做一些不同的事情然后只是移动它的字节。也许 class 存储了一个指向同一实例成员的指针。只是复制字节会破坏实例。


我也认为这不会有太大区别。当应用程序需要多 60 个字节时,这并不是很明显。