我应该使用 std::string 还是 const char* 作为字符串常量?

问题描述 投票:0回答:7

我看过这两种风格的代码,我不确定一种是否比另一种更好(这只是风格问题)?您对为什么选择其中一个而不是另一个有什么建议吗?

// Example1
class Test {
    private:
        static const char* const str;
};

const char* const Test::str = "mystr";
// Example2
class Test {
     private:
         static const std::string str;
};

const std::string Test::str ="mystr";
c++ constants static-members stdstring
7个回答
57
投票

通常你应该更喜欢

std::string
而不是普通的 char 指针。然而,在这里,用字符串文字初始化的 char 指针有一个显着的好处。

静态数据有两种初始化。一种称为静态初始化,另一种称为动态初始化。对于那些使用常量表达式初始化并且是 POD(如指针)的对象,C++ 要求它们的初始化在一开始就发生,在动态初始化发生之前。初始化这样的 std::string 将动态完成。

如果某个类的对象在某个文件中是静态对象,并且需要在初始化期间访问该字符串,则可以依赖在使用

const char* const
版本时已经设置的对象,同时使用
std::string
版本未静态初始化,您不知道字符串是否已初始化 - 因为跨翻译单元边界的对象初始化顺序未定义。


4
投票

嗯,std::string 与 const char * 不同。我通常会在使用 std::string 方面犯错误,因为它是一个具有许多附加功能的类,使其更易于使用。

如果性能至关重要,并且您使用 const char * 来提高效率,那么就这样做。


3
投票

在使用 C++ 时,我倾向于使用 std::string 而不是 char *。我更喜欢 std::string 主要是因为它的内置功能以及不必处理指针的便利性和安全性。

但是,正如其他人提到的,如果您过度关心性能,const char * 版本可能会更有利。我似乎记得某个聪明的人曾经说过过早的优化是万恶之源(或类似的)。 :)


2
投票

第一个示例需要较少的管理字符串的开销(即,只需一个指向 TEXT 部分的指针)。此外,第二种方法可能还需要堆分配以将字符串文字复制到 std:string 类缓冲区。因此,您最终会得到数据的两个副本。


2
投票

在涉及多个具有不同编译器和库的平台、许多团队和很多人的大型项目中,我们反复遇到静态 std::string 的问题。在某些平台上,std:string 实现不是线程安全的。在一个平台上,编译器优化的代码跳过了从全局静态常量初始化本地 std:string。在解决了其中一些问题之后,我们只允许内置类型使用全局静态常量。


1
投票

第二个版本的优点是它具有预先计算的长度以及充实的字符串类的其他优点。第一个的优点是唯一的初始化只是将一个指针分配给已加载到可执行映像中的静态数据,而第二个则必须从同一指针初始化字符串。


1
投票

首先,如果不使用 char*。如果你想要一个 ASCIIZ 字符串,直接定义其中之一:

const char Test::str[] = "mystr";

在大多数情况下,这就是我会使用的。为什么要为字符串类的开销浪费时间和内存呢?

请注意,“sizeof(Test::str)”将准确地给出数组的长度,即字符串的长度,包括终止 NUL (strlen(str)+1)。

© www.soinside.com 2019 - 2024. All rights reserved.