【发布时间】:2012-01-13 05:26:05
【问题描述】:
在我的一个 C++ 项目中,我在将所有 char* 替换为 std::string 之前迈出了一步,但我发现有一个特定的场合 std::string 惨遭失败。
想象一下我有这两个功能:
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* 构造它时,它不是。我的问题是:为什么会这样?我错过了什么吗?我的标准库是否优化得不够充分,或者出于某种原因(我不知道)这完全不安全?
【问题讨论】:
-
写时复制并不是真正的“超级优化”。我相信 GCC 的标准库仍然使用它,但这只是因为它在 10 年前有意义,那时多线程还没有成为常态。今天实现的一个理智的库实现将避免像瘟疫一样的 COW。
-
我认为标准甚至不允许 COW,因为成员函数的迭代器失效要求。
-
Afaik C++03 允许 COW。我相信 C++11 禁止它