Arrays(C ++):为什么使用指针直接操作?

时间:2013-11-03 19:47:43

标签: c++ arrays pointers

我理解指针非常好,我理解它们的很多用途。但是,我从来没有想过在数组中使用指针。我知道怎么做,但我不明白为什么用这个直接操纵数组。我只想知道我只能使用数组中的指针。感谢。

2 个答案:

答案 0 :(得分:6)

考虑:

struct Match {
    int scores[30];
    char names[30][64];
    int ages[30];
    char description[1024];
};

此结构长3184字节。

Match matches[16];

如果我决定匹配[0]和匹配[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个Match指针的数组,占用4Mb或8Mb(取决于32/64位),其中许多可以是nullptr。我只需要指向当前有用的条目。

1,000,000个Match对象的数组需要3Gbs的ram。

相反,如果所有1,000,000个指针都必须指向一个唯一的Match对象实例,那么你就有~3Gb的对象加上〜1Mb的指针。

答案 1 :(得分:0)

你看,一个数组与一个对象不同。数组本身将内存分配为块。然后,数组将指针内容指向值。这意味着,你可以做array1 = array2。不复制自身的值,只复制地址。

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

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

虽然我不是C ++中最好的指针,但我很确定这是它的工作原理。