arc*_*tom 5 c++ string pointers char
在下面的课程中是否有任何好处或原因,为什么speak()返回一个const char*而不是std::string?
class Animal
{
protected:
std::string m_name;
Animal(std::string name)
: m_name(name)
{
}
public:
std::string getName() { return m_name; }
const char* speak() { return "???"; }
};
Run Code Online (Sandbox Code Playgroud)
诸如此类的字符串文字的"???"作用是告诉编译器包含一块包含特定字符序列(加上'\0'末尾的字符)的全局内存。字符串文字表达式有一个const char*指向该全局内存的类型值。
这意味着在这种非常特殊的情况下,传递指针是安全的。注意下面的函数
std::string speak() { return "???"; }
Run Code Online (Sandbox Code Playgroud)
具有相同的函数体,但代码路径却截然不同。字符串文字表达式(全局内存、指针)仍然存在,但它被用作 ; 构造函数的参数std::string。它被隐式转换为std::string.
该构造函数std::string动态分配一些内存(在这种情况下可能不会使用短字符串优化)并从您给它的指针进行复制。
因此,在这种非常特殊的情况下,如果您只有字符串文字而没有其他内容,则可以返回const char*. std::string当传递给另一个需要它的函数时,它可能会被隐式转换,所以const char*并不是那么优化。
std::string带有许多可能不需要和未使用的功能。如果您不想要所有这些功能,您应该考虑使用成本。传递std::string至少需要从文字到字符串的内部存储的第一个副本。如果将字符串传递给其他函数并返回,也许您会得到一些额外的副本。如果存在小字符串优化,则不能简单地移动字符串,因此在这种情况下成本会变得更高。
如果您不想要成本但获得常量字符串的所有功能,则应该查看std::string_view. 该实现通常只包含一个指向底层数据的指针和一个大小值。因此它的成本较低,而且功能非常丰富。
const char*事实上,如果符合你的需要,通过也没有什么错。
对常量字符串使用“always”std::string是一种非常常见的模式,但不是一个好的模式。