這是this question的後續行動。假設我編寫了一個接受或返回一個常量字符串的C++接口。我可以用一個const char * 0結尾的字符串:字符串接受界面應該如何?
void f(const char* str); // (1)
另一種方法是使用一個std :: string的:
void f(const string& str); // (2)
它也可以編寫過載,同時接受:
void f(const char* str); // (3)
void f(const string& str);
或與升壓字符串算法相結合,甚至一個模板:
template<class Range> void f(const Range& str); // (4)
我的想法是:
- (1)不是C++雜交,並且可以是效率較低時隨後的操作可能需要知道字符串長度。
- (2)不好,因爲現在
f("long very long C string");
調用std :: string的構造,涉及堆分配。如果f
使用該字符串只是將其傳遞給一個需要C字符串的低級接口(如fopen),那麼這只是浪費資源。 - (3)導致代碼重複。儘管一個
f
可以根據最有效的實現來調用另一個。然而,我們不能根據返回類型來重載,就像std :: exception :: what()那樣返回一個const char *。 - (4)不適用於單獨的編譯,並可能導致更大的代碼膨脹。
- 根據實現需要什麼來選擇(1)和(2),好吧,將實現細節泄漏到接口。
問題是:什麼是優先的方式?是否有任何單一的指導方針可以遵循?你有什麼經驗?
編輯:還有一個第五個選項:
void f(boost::iterator_range<const char*> str); // (5)
其具有(1)(不需要構造一個字符串對象)和(2)(所述的尺寸的優點字符串顯式傳遞給函數)。
)。字符串將在堆棧上構建 – 2011-01-09 17:58:52
@nice:正確的,std :: string本身被分配到堆棧上。但是如果你的字符串足夠長或者你的實現沒有使用短字符串優化,那麼std :: string將在堆上分配它的存儲空間。 – ybungalobill 2011-01-09 18:02:12