[英]C++ array pointers [] or ++
假設我想迭代一系列雙打並求它們。 我有兩種方法可以做到這一點。
一個)
double sum (double * series, int size) {
double sum = 0.0;
for (int i = 0; i < size; i++) {
sum += *series++;
}
return sum;
}
B)
double sum (double * series, int size) {
double sum = 0.0;
for (int i = 0; i < size; i++) {
sum += series[i];
}
return sum;
}
這是更好的,為什么/何時我應該使用一個而不是另一個。
這是一個可讀性問題,它不應該影響性能。 我認為B是最可讀的,因此更可取。
我還可以提出第三個變體,它是基於范圍的(注意begin
和end
參數):
double sum (double* begin, double* end) {
double sum = 0.;
for (double* it = begin; it != end; ++it) {
sum += *it;
}
return sum;
}
在許多情況下,這是慣用的C ++,並且更容易概括。 這並不是說它總是更可取,它只是關於可讀性和可維護性的問題的另一種變體。
我也會選擇樣式B,但是你應該更喜歡標准算法而不是顯式循環:
#include <numeric>
double sum(const double* const series, const int size) {
return std::accumulate(series, series + size, 0.0);
}
兩者本身都不比另一方好; 你應該選擇哪個能使你的代碼更清晰。 對於任何現代編譯器,它們應該針對相同的機器代碼進行優化。
但請注意,將原始指針傳遞給原始數組在C ++中被認為是錯誤的樣式。 考慮使用容器類,如std::vector
。
在性能方面,使用現代優化編譯時應該沒有區別。
早在1978年,第一種方法在PDP-11上有所加快,因為間接自動增量尋址需要更少的周期來處理,並且沒有優化器能夠將索引+偏移轉換為自動增量。
PS設定series -= size;
沒有效果,因為series
是按值傳遞的。
迭代數組的C ++ 11方法(如果你不想只是求它們並且累積不符合你的需要)是:
double sum (const double * series, int size) {
double sum = 0.0;
for_each (series, series + size, [&](double v) {
sum += v;
});
return sum;
}
請注意,如果您使用了向量或列表,則會得到幾乎相同的代碼:
double sum (const vector<double>& series) {
double sum = 0.0;
for_each (begin(series), end(series), [&](double v) {
sum += v;
});
return sum;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.