【发布时间】:2016-03-07 01:59:49
【问题描述】:
标准库中通用交换的当前实现类似于
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;
}
}
我认为这种实现在空间使用方面更好,因为它只需要一个字节。
【问题讨论】:
-
不管它可能有也可能没有其他问题,时间性能可能会更差,真的有理由将一般情况限制为仅使用一个字节的临时空间吗?只有在最受限制的系统上才有必要这样做。
-
一次一个字节的方法将起作用,但仅适用于 POD 类型。对于无法简单复制的类型,它不会做正确的事情。
-
对于不能随意简化为单字节移动的原子/易失类型也失败了。
-
“在空间使用方面更好,因为它只需要一个字节” - CPU 寄存器可能是 4 或 8 字节宽:处理较小的大小将是 效率较低。作为一般规则,当您刚刚学习语言时(正如问题所暗示的那样),请相信编译器会比您更好地优化,除非分析证明您必须参与其中。
-
@JeremyFriesner :您的意思是可以简单复制的类型。 PODness 是 C++03 的要求。
标签: c++ c++14 swap c++-standard-library