繁体   English   中英

在C ++中定义类字符串常量?

[英]Defining class string constants in C++?

我已经看到了这两种风格的代码,我不确定一个是否比另一个更好(它只是风格问题)? 你有什么建议可以选择一个而不是另一个。

 //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";

通常你应该更喜欢std::string不是普通的char指针。 但是,这里使用字符串文字初始化的char指针具有显着的好处。

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

如果某个类的对象在某个文件中是静态对象,并且在初始化期间需要访问该字符串,则在使用const char* const版本时,可以依赖它进行设置。 std::string版本,没有静态初始化,你不知道字符串是否已经初始化 - 因为没有定义跨翻译单元边界的对象初始化顺序。

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

如果性能是最重要的,并且您使用const char *来提高效率,那就这样吧。

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

但是,正如其他人所提到的,如果您过分关注性能,那么const char *版本可能会有利。 我似乎记得有人聪明曾经说过早优化是所有邪恶(或某些此类)的根源。 :)

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

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

第二个版本的优点是它具有预先计算的长度和充实的字符串类的其他好处。 第一个优点是唯一的初始化只是为已经加载到可执行映像中的静态数据指定一个指针,其中第二个初始化必须从同一个指针初始化字符串。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM