我非常了解指针,并且我了解它们的很多用途。但是,我从未想过在数组中使用指针。我知道该怎么做,但我不明白为什么要使用它而不是直接操作数组。我只想知道一些我只能在数组中使用指针才能做到的事情。谢谢。
2 回答
考虑:
struct Match {
int scores[30];
char names[30][64];
int ages[30];
char description[1024];
};
这个结构是 3184 字节长。
Match matches[16];
如果我决定需要交换matches[0] 和matches[1],交换两者需要完成以下工作(这就是std::swap 的实现方式):
Match temp; // prepare 3184 bytes on the stack.
temp = matches[0]; // copy 3184 bytes
matches[0] = matches[1]; // copy 3184 bytes
matches[1] = temp; // copy 3184 bytes
那是很多 cpu 周期复制/移动数据。
如果我使用指针:
Match* matches[16];
for (size_t i = 0; i < 16; ++i) {
mathces[i] = new Match;
}
所有 std::swap 所要做的就是交换两个指针:
Match* temp = matches[0]; // 4 or 8 bytes
matches[0] = matches[1]; // 4 or 8 bytes
matches[1] = temp; // 4 or 8 bytes
更干净,并且在优化后,这可能可以在寄存器中完成以获得极高的性能。
这样做的另一个优点是节省内存。我可以拥有一个包含 1,000,000 个匹配指针的数组,占用 4Mb 或 8Mb(取决于 32/64 位),其中许多可以是nullptr
. 我只需要指向当前有用的条目的指针。
包含 1,000,000 个匹配对象的数组需要 3Gbs 的内存。
相反,如果所有 1,000,000 个指针都必须指向一个唯一的 Match 对象实例,那么您将拥有 ~3Gb 的对象加上 ~1Mb 的指针。
你看,数组不同于对象。数组本身将内存分配为一个块。然后数组包含指向值的指针。这意味着,您可以执行 array1 = array2. 值本身不会被复制,只有地址。
为什么数组是指针是因为内存管理,复制数组太容易了。数组不像对象那样工作。
当您访问数组中的索引 1 时,您询问了数组:告诉我存储在该数组的索引 1 处的地址的值。
虽然我在 C++ 方面不是最好的,尤其是在指针方面,但我很确定这就是它的工作原理。