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