簡體   English   中英

靜態字符* vs #define在C ++ VS2005中

[英]static char * vs #define in C++ VS2005

我有一個大型程序,其中包含使用MFC和/ clr編譯的幾個大型DLL。 程序集中有65535個全局FieldRVA條目限制。 如果更多,則加載程序會引發異常。 我已經有啟用字符串池(/ GF)。

我有很多類似的代碼:

static char *pSTRING_ONE = "STRING_ONE";

如果我使用如下宏進行編譯:

#define pSTRING_ONE  "STRING_ONE"

它極大地減少了CLR元數據的字符串,因此我進行了編譯,但隨后遇到了使用#define所有問題。

問題是:除了更改靜態char *-> #define之外,還有其他選擇嗎?

從MSDN:

http://msdn.microsoft.com/zh-CN/library/s0s0asdt.aspx

“ / GF編譯器選項為每個唯一的字符串創建一個可尋址部分。默認情況下,一個目標文件最多可以包含65,536個可尋址部分。如果您的程序包含65,536個以上的字符串,請使用/ bigobj編譯器選項來創建更多部分。 ”

聽起來/ bigobj是您的朋友在這里...

與其將字符串存儲在程序的數據段中(因為您顯然有大量的字符串),不如將其存儲在包含它們的資源文件中。 然后,只需動態分配字符串池並在程序啟動時加載字符串資源文件即可。 這應該完全消除有關問題。

如果這不是一個選擇,那么假設這些文件包含在文件范圍內,為什么要將字符串設為static 這只是說“僅文件作用域”的C方法(在C ++中已棄用)。 const char *pSTRING_ONE = "STRING_ONE"; 將創建在所有翻譯單元之間共享的全局字符串。 在這種情況下,只能創建一個包含所有字符串的文件,然后通過標題中的extern聲明引用它們。

如果不使用/GF怎樣? 從Bukes的答案看來,通過合並字符串,您正在使編譯器為每個字符串創建一個段。

不幸的是,解決我們問題的最佳方法是將有問題的代碼包含在類中。

// Old Way
static char *pSTRING_ONE = "STRING_ONE";

class CFieldDefs
{
  public:
     static char *pSTRING_ONE;
}

char *CFieldDefs::pSTRING_ONE = "STRING_ONE";

用法:

CFieldDefs:pSTRING_ONE;

即使更改非常繁瑣,它也大大減少了DLL中fieldRVA條目CLR字段的數量。 感謝你的幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM