[英]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.