【发布时间】:2013-08-27 21:28:56
【问题描述】:
我有一些函数需要返回一个 const char*(这样一整套其他函数最终都可以使用它)。
我知道如果我有如下定义:
const char* Foo(int n)
{
// Some code
.
.
.
return "string literal, say";
}
那么就没有问题了。但是我是否正确地说,如果 Foo 必须返回一些只能在运行时确定的字符串(取决于参数 n,(其中每个 n 取 [0, 2^31-1] 中的任何值)唯一地确定返回字符串)) 那么我必须使用堆(或返回像 std::string 这样在内部使用堆的对象)?
std::string 对于我想要完成的任务来说似乎太重了(至少有两个函数必须传递包裹),并且在 Foo 内分配内存以由调用者释放并不让我觉得安全向前走。我不能(轻松)传递对需要此函数的对象的引用,并不是说我相信无论如何都是可能的,但宏诡计是不可能的。
有什么简单的事情我还没有考虑到吗?
编辑
感谢大家的回答,我会选择 std::string (我想以迂回的方式要求确认没有办法向编译器暗示它应该存储一些 char 的内容[] 在它存储字符串文字的同一位置)。至于“重量级”(我很高兴复制它们并没有我想象的那么浪费)这不是最好的表达方式,也许“不同”会更接近我最初的担忧。
【问题讨论】:
-
返回一个
std::string或者用2^31case 编写一个switch语句... -
std::string有一个移动构造函数,所以你不必每次返回时都复制它。 -
std::string对你的目的来说真的很重要吗?你怎么知道?您不会过早优化吗? -
您可以返回一个指向静态分配字符串的指针,但坦率地说,
std::string是显而易见的选择,它根本不是“重量级”。显然你不能真正使用字符串 literals 除非你想硬编码所有 20 亿个字符串。 -
除了
std::string的移动构造函数和移动赋值运算符之外,复制省略导致的副本比您天真的预期的要少。
标签: c++