0

我非常了解指针,并且我了解它们的很多用途。但是,我从未想过在数组中使用指针。我知道该怎么做,但我不明白为什么要使用它而不是直接操作数组。我只想知道一些我只能在数组中使用指针才能做到的事情。谢谢。

4

2 回答 2

6

考虑:

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 的指针。

于 2013-11-03T19:56:08.493 回答
0

你看,数组不同于对象。数组本身将内存分配为一个块。然后数组包含指向值的指针。这意味着,您可以执行 array1 = array2. 值本身不会被复制,只有地址。

为什么数组是指针是因为内存管理,复制数组太容易了。数组不像对象那样工作。

当您访问数组中的索引 1 时,您询问了数组:告诉我存储在该数组的索引 1 处的地址的值。

虽然我在 C++ 方面不是最好的,尤其是在指针方面,但我很确定这就是它的工作原理。

于 2013-11-03T19:58:22.960 回答