如果您想提高性能,这是最快的交换操作,比标准 C++ 编译器上运行的 stl::swap 更快。
template<typename T=int>
void swap(T* p, T* q, int size)
{
T* ptmp = new T[size];
memcpy(ptmp, p, sizeof(T)*size);
memcpy(p, q, sizeof(T)*size);
memcpy(q, ptmp, sizeof(T)*size);
delete[] ptmp;
}
您可以通过用(int*)alloca(sizeof(int)*size)替换对 new 的调用并注释掉删除来使其更快。但是 alloca 有点受限,因为它使用函数堆栈。好的,你可以这样称呼它:
//line 5
swap(A[j], A[i]);
//int t1 = A[j][0];
// ...
//line 18
这是来自 std::swap() 的文档:
非数组:常量:只执行一个构造和两个赋值(尽管每个操作都有其自身的复杂性)。
数组:N 中的线性:对每个元素执行交换操作。
由于此 swap() 对内存块执行操作,而不是逐个元素地执行操作,因此它比 std::swap() 更好。我已经使用 AQtime 确认了结果。
对于任何考虑“空间局部性、缓存未命中、缓存对齐、缓存友好等等等等…… ”的人来说,这里是给他们的:
memcpy 实现通常使用 SIMD 指令编写,这使得一次可以洗牌 128 位。SIMD 指令是汇编指令,可以对最长 16 字节的向量中的每个元素执行相同的操作。这包括加载和存储指令。
对于感到困惑的人,以下是 Microsoft 在实用程序头文件 VC 2012 中实现 std::swap() 的方式
// TEMPLATE FUNCTION swap
template<class _Ty,
size_t _Size> inline
void swap(_Ty (&_Left)[_Size], _Ty (&_Right)[_Size])
{ // exchange arrays stored at _Left and _Right
if (&_Left != &_Right)
{ // worth swapping, swap ranges
_Ty *_First1 = _Left;
_Ty *_Last1 = _First1 + _Size;
_Ty *_First2 = _Right;
for (; _First1 != _Last1; ++_First1, ++_First2)
_STD iter_swap(_First1, _First2);
}
}