【发布时间】:2011-01-19 17:59:54
【问题描述】:
我有一张代表数据库对象的地图。我想从中获得“众所周知”的价值
std::map<std::string, std::string> dbo;
...
std::string val = map["foo"];
一切都很好,但让我感到震惊的是,“foo”在每次调用时都被转换为临时字符串。当然,最好有一个常量 std::string (当然,与刚刚获取对象的磁盘 IO 相比,它可能是一个很小的开销,但我认为它仍然是一个有效的问题)。那么 std::string 常量的正确用法是什么?
例如-我可以拥有
const std::string FOO = "foo";
在 hdr 中,但后来我得到了多个副本
编辑:还没有答案说明如何声明 std::string 常量。忽略整个地图、STL 等问题。很多代码都是面向 std::string 的(我的当然是),很自然地需要常量而不为内存分配反复支付
EDIT2:从 Manuel 那里取出 PDF 回答的第二个问题,添加了坏习语的例子
EDIT3:答案摘要。请注意,我没有包括那些建议创建新字符串类的内容。我很失望,因为我希望有一个简单的东西只能在头文件中工作(比如 const char * const )。反正
a) 来自马克 b
std::map<int, std::string> dict;
const int FOO_IDX = 1;
....
dict[FOO_IDX] = "foo";
....
std:string &val = dbo[dict[FOO_IDX]];
b) 来自弗拉德
// str.h
extern const std::string FOO;
// str.cpp
const std::string FOO = "foo";
c) 来自 Roger P
// really you cant do it
(b) 似乎最接近我想要的,但有一个致命缺陷。我不能拥有使用这些字符串的静态模块级代码,因为它们可能尚未构建。我考虑过(a)并且实际上在序列化对象时使用了类似的技巧,发送索引而不是字符串,但是对于通用解决方案来说似乎需要很多管道。所以遗憾的是 (c) 赢了,std:string 没有 simple const idiom
【问题讨论】:
-
重新编辑,我确实尝试解决这个问题(“不,这不是 std::string 的工作方式”和“这是另一个字符串类”),但请注意,如果你只是想存储 const std::strings 在某个地方作为全局变量,您只需为分配一次(在程序启动时)使用 ref-counted 实现(gcc 提供并且标准明确允许)。只需确保这些全局变量是 const 即可轻松避免各种逻辑错误。
-
所以你的回答是——不可能。不清楚。如果没有人想出更好的答案,那么你会得到对勾
-
其实我目前很喜欢曼努埃尔的回答。抱歉我不够清楚,这就是我发表评论的原因,但我也无意中偷偷加入了另一个选择。 :)
-
但他仍然没有说如何做 std::string 常量。