我最近一直在做一些必要的优化。我一直在做的一件事是更改一些ostringstreams-> sprintfs。我正在将一堆std :: strings冲刺到ac样式数组,ala
char foo[500];
sprintf(foo, "%s+%s", str1.c_str(), str2.c_str());
事实证明,Microsoft的std :: string :: c_str()实现在恒定时间内运行(它只返回一个内部指针)。看来libstdc ++也是一样。我意识到std不能保证c_str,但是很难想象另一种方式。例如,如果他们将其复制到内存中,要么不得不为缓冲区分配内存(将其留给调用方销毁,而不是STL合同的一部分),要么必须将其复制到内部静态对象中。缓冲区(可能不是线程安全的,并且您无法保证其寿命)。因此,仅返回指向内部维护的以null终止的字符串的指针似乎是唯一可行的解决方案。
c_str
是const方法(或至少具有const重载-我忘记了),但这不会更改逻辑值,因此可能是的原因mutable
。这将打破指针其他呼叫c_str
,但此指针必须指的是同一个逻辑串(所以没有新的理由来重新分配-必须已经有一个空终止),或者必须已到非通话-const方法之间。