标准库中的常规交换的当前实现类似于
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;
}
}
我认为这种实现在空间使用方面更好,因为它只需要一个字节。
答案 0 :(得分:2)
交换课时需要考虑许多因素。对于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
}
答案 1 :(得分:0)
您必须考虑每个类都可以定义在实例复制或移动实例时应该发生的事情。有时一个类可能会做一些不同的事情然后移动它的字节。也许该类存储指向同一实例的成员的指针。只是复制字节就会破坏当时的情况。
我还认为它不会产生太大的影响。当应用程序需要60个字节时,它并不是真的值得注意。