繁体   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