簡體   English   中英

C ++數組指針[]或++

[英]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是最可讀的,因此更可取。

我還可以提出第三個變體,它是基於范圍的(注意beginend參數):

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM