2010-01-20 64 views

回答

8

對於字符串文字,只對來自文字的字符串常量,我會使用const char[]std::string的主要優點是它具有免費的內存管理,但這不是字符串文字的問題。

它是字面的實際類型,它可以直接用於任何需要舊C風格的空字符串或C++字符串(隱式轉換踢入)的API。您還可以通過使用數組而不是指針來獲得編譯時間大小的實現。

現在,當定義函數接口,並且即使常量被傳入時,我更喜歡std::string而不是const char*,因爲在後一種情況下大小會丟失,並且可能需要重新計算。

出於我自己的經驗。在對日誌庫(使用可變參數)的每次調用中,我都寫了.c_str()的老版本,用於包含信息/錯誤消息的文本字符串。

2

你應該用什麼更適合你。如果沒有特殊要求,我會使用std::string,因爲它可以完成所有的記憶工作。

對於字符串文字,我會用const char*。針對const char[]的原因是您可以使用const char*來初始化另一個常量。檢查以下代碼:

const char str1[] = "str1"; 
const char* str11 = "str11"; 

const char str2[] = str1; // <<< compile error 
const char* str22 = str11; // <<< OK 

字符串文字具有靜態存儲的持續時間(如2.13.4/2),從而指針const char*將是有效的,直到節目結束。

+0

由於複製寫入機制,如果你在許多不同的地方使用相同的字符串,它的速度在許多STL實現中會更快,而且它比普通的C字符串更容易使用。除此之外,如果您需要支持多種語言,我寧願使用std :: wstring。 – jdehaan 2010-01-20 07:56:29

+0

@jdehaan:如果存在(m)任何std庫實現(不是STL實現,因爲std :: string不是STL的一部分),那麼我仍會感到驚訝。在MT環境中,這通常會變成悲觀。我認爲小字符串優化(小字符串不是分配在堆上,而是堆棧中)是現在通常喜歡的。 – sbi 2010-01-20 08:10:41

+0

在大多數實現中,寫入時的複製正在被刪除(如果仍然存在)。它在多線程環境中有問題,因爲從用戶的角度來看,線程安全的某些操作(它們指向不同的std :: string)可能不是線程安全的。考慮一個字符串被複制,每個副本傳遞到不同的線程進行修改。每個線程都有它自己的字符串,沒有共享對象,但實際上在'寫時複製'內部實現中可能存在爭用條件。在許多情況下,向庫中添加鎖定機制會使其變得比普通實現慢。 – 2010-01-20 08:12:26

2

你在做什麼呢?你的方法期望什麼?

const char在存儲中較輕,但沒有std :: string的能力,或者使用它時的安全性。但是,如果你有很多C API,這可能是更明智的選擇。

std :: string將是首選選項。

+2

.c_str()是你的朋友:) – JPvdMerwe 2010-01-20 07:45:44

+0

@JPvdMerwe:theatrus是正確的。如果你所做的只是將一個常量字符串傳遞給需要'const char *'的函數,那麼使用'std :: string' /'.c_str()'沒有意義。 'char'的'const'數組沒有構造函數調用代價,並且可以直接傳遞給函數,這使得構造函數的成本更低,並且比std :: string更便宜。 – 2010-01-20 08:11:30

+0

是的字符串文字,我完全同意,沒有意義浪費你的處理器時間。 – JPvdMerwe 2010-01-20 09:12:12

1

對於字符串文字,我傾向於使用const std::string而不是const char *。由於將字符串文字傳遞到函數const std::string &將在每次調用而不是僅僅調用一次時靜靜地創建字符串。但是,如果我主要使用函數期望const char *的文字,我將使用它。

我傾向於贊成std::string爲apis。

當然,如果我使用unicode,我使用std::wstringwchar_t

+0

我對unicode做了相同的假設,但這很有趣:http://utf8everywhere.org/。事實證明,wchar_t是unicode歷史中簡單時間的遺留物,Win32 API是WCHAR本地的。如果你堅持使用UTF-8和std :: string,生活可能會更好。 – terriblememory 2016-06-06 16:57:02

相關問題