使用以下方法,我们可以交换两个变量A
和B
A = A XOR B
B = A XOR B
A = A XOR B
我想在C ++中实现这样一个方法,它可以运行所有类型(int,float,char,...)以及结构。我们知道包括结构在内的所有类型的数据都占用了特定的内存空间,例如4个字节,8个字节
在我看来,这种交换方法必须适用于除基于指针的类型之外的所有类型,它应该交换两个变量的内存,即位,
我的问题
我不知道如何在C ++中实现这样一个使用结构的方法(那些不包含任何指针)。任何人都可以帮助我吗?
答案 0 :(得分:2)
您的问题很容易缩减为原始内存的xor-swap缓冲区。这样的事情。
void xorswap(void *a, void *b, size_t size);
这可以用原始类型的xorswap
来实现。例如:
void xorswap(void *a, void *b, size_t size)
{
if (a == b)
return; //nothing to do
size_t qwords = size / 8;
size_t rest = size % 8;
uint64_t *a64 = (uint64_t *)a;
uint64_t *b64 = (uint64_t *)b;
for (size_t i = 0; i < qwords; ++i)
xorswap64(a64++, b64++);
uint8_t *a8 = (uint8_t*)a64;
uint8_t *b8 = (uint8_t*)b64;
for (size_t i = 0; i < rest; ++i)
xorswap8(a8++, b8++);
}
我将xorswap64()
和xorswap8()
的实施作为练习留给读者。
另请注意,为了提高效率,原始缓冲区应为8字节对齐。如果情况并非如此,根据体系结构的不同,代码可能工作不理想或根本不工作(再次,对读者的练习; - )。
其他优化也是可能的。您甚至可以使用Duff's device展开最后一个循环,但我不知道它是否值得。您必须对其进行分析才能确定。
答案 1 :(得分:0)