在我的一個C++項目中,我是用std::string
替換所有char*
之前的一個步驟,但我發現std::string
失敗的一個特定情況。C++字符串對字符串文字不夠優化
想象我有這2個功能:
void foo1(const std::string& s)
{
...
}
void foo2(const char* s)
{
...
}
如果我寫的是這樣的:
const char* SL = "Hello to all!";
foo1(SL); // calls malloc, memcpy, free
foo2(SL);
在foo1
的SL
將隱式轉換爲std::string
。這意味着std::string
構造函數將分配內存,並且它會將字符串文字複製到該緩衝區。在foo2
雖然沒有這些會發生。
在大多數實現中,std::string
應該是超級優化的(例如寫入時拷貝),但是當我使用const char*
構建時,它不是。我的問題是:爲什麼會發生這種情況?我錯過了什麼嗎?我的標準庫沒有足夠優化或者出於某種原因(我不知道),這是完全不安全的嗎?
複製寫入並不是真正的「超級優化」。我相信海灣合作委員會的標準庫仍然使用它,但僅僅是因爲十年前,在多線程是常態之前它纔有意義。今天制定的一個理智的圖書館實施將避免像瘟疫一樣的COW。 – jalf
我認爲該標準甚至不允許COW,因爲成員函數的迭代器失效要求。 – Xeo
Afaik C++ 03允許COW。我相信C++ 11禁止它 – jalf