簡體   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