2016-08-23 117 views
0
void func(char c) {} 
void func(std::string) {} 

int main() { 
    std::string s("HelloWorld"); 

    // method 1 
    func(s); 

    // method 2 
    for(std::size_t i = 0; i < s.size(); i++) { 
     func(s[i]); 
    } 
} 

爲什麼在第二次調用OK時傳遞值?是不是最終有效地複製相同數量的字符?或者他們實際上是一樣的,我錯過了什麼?按值傳遞字符串vs按值傳遞每個字符

+1

什麼是實際代碼的目的編寫的youre並有一個問題?該函數是否應該一次只處理一個字符,或者處理整個字符串? –

+2

您還應該計算兩種情況下的函數調用次數。如果你想知道什麼是最快的,也做一些測量。當然,不要忘記傳遞參考。 –

回答

1

std::string的副本將執行分配(除非小字符串優化),而傳遞char作爲參數可能會通過寄存器完成。

std::string通過const引用

void func(const std::string&); 
+0

並非所有系統都有足夠的寄存器傳遞值的寄存器。例如,像32位x86架構一樣。但這不是最大的交易,最大的交易是正在進行的*函數調用的數量。有很大的區別。 –

+0

我的問題是你必須複製任何值至少兩次。例如,如果您將一個char分配給一個char數組中的單元格,那麼您需要使用賦值運算符,我假設這個賦值運算符將通過值取char,然後再將此值複製到所需的單元格中。 – mkmostafa

+0

@mkmostafa你的*實際*問題是什麼?它是「效率」還是優化?複製一個角色是微不足道的,只有在短時間內完成數百萬次時纔會引起注意。我認爲你需要閱讀[XY問題](http://xyproblem.info/)並考慮它與你的問題的關係。 –

1

按值傳遞一個字符串的每個字符的功能是一樣沒有,沒關係,按值傳遞整個字符串。也就是說,在這兩種情況下,如果可以的話,您應該更喜歡一些替代方案,即整個字符串不必複製或遍歷。

1

按值傳遞單個字符是可以的,因爲字符的大小小於需要通過引用傳遞的指針的大小。另外,不會爲字符調用複製構造函數。

(這並不意味着調用函數在一個字符串的每個字符總是OK)