首选使用指针交换变量值的原因是因为它避免了复制大量内存。任何内存复制都需要时间,因此将内存复制量保持在最低限度可以使算法运行得更快。
内存复制如何成为问题?
考虑以下伪代码,它可以就地交换任何类型的两个值:
tempValue = value1; /* first memory copy */
value1 = value2; /* second memory copy */
value2 = tempvalue; /* third memory copy */
在您最初的问题中,您交换了两个整数。假设一个整数的宽度是 4 个字节,那么上面的伪代码将在三个复制操作中交换两个整数。复制的总内存:12 字节。如果我们假设一个指针的宽度也是 4 个字节,那么交换指针值也需要复制 12 个字节的内存。在这种情况下,为交换值而复制的内存量与交换指针相同。在这种情况下,任何一种方法都将提供相同的性能。
现在考虑这个代码片段:
typedef struct _mystruct
{
char buffer[128]; /* size of structure becomes at least 128 bytes */
} MYSTRUCT, *PMYSTRUCT;
MYSTRUCT value1, value2;
PMYSTRUCT pValue1 = &value1;
PMYSTRUCT pValue2 = &value2;
的大小MYSTRUCT
至少为 128 字节。使用上面的伪代码来交换 和 的值value1
将value2
需要三个 128 字节的内存副本,或总共 384 字节。另一方面,如果我使用两个指针pValue1
和交换值pValue2
,假设指针是 4 字节宽,则在交换期间复制的字节数与上面的整数示例相同;只有 12 个字节。与不使用指针的 384 字节相比,这非常快并且性能会好得多。
这就是为什么char**
用作字符串交换函数的参数的原因。被交换的字符串的长度是未知的,因为交换值意味着复制内存,长字符串可能会大大降低性能。使用指针意味着交换的性能将保持不变,无论被交换的字符串的长度如何。