我理解指针非常好,我理解它们的很多用途。但是,我从来没有想过在数组中使用指针。我知道怎么做,但我不明白为什么用这个直接操纵数组。我只想知道我只能使用数组中的指针。感谢。
答案 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 ++中最好的指针,但我很确定这是它的工作原理。