字符串常量在编译的DLL中占用多少空间?

时间:2011-10-26 07:46:00

标签: c# silverlight string compilation

我正在尝试解决影响Silverlight应用程序集的编译大小的问题。显然,我想减小应用程序的大小,最明显的做法是摆脱一些常量字符串(例如错误字符串 - 应用程序或其他资源密集型实体中没有图像)。我随后将根据需要从服务器中提取字符串。在我接受这项工作之前,我想弄清楚大概节省的空间。

编译的常量在编译的DLL中占用了多少内存?我假设它被存储为UNICODE UTF-16字符数组,因此每个字符将是2个字节?它是否正确?是否有经验法则(或更严格的规则来计算可以对用于创建最终.xap文件的zip压缩的字符串进行多少压缩?

编辑显然,我提出这个问题的方式引起了一些混乱。我不是说'内存占用'是'应用程序消耗的内存量',而是'dll'的大小,因此也就是创建的xap文件。

3 个答案:

答案 0 :(得分:4)

我们这样说:.NET中的System.Char(c#中的char)是2个字节。它无法表示所有Unicode字符。只有BMP(基本多语言平面)的字符可以由单个Char表示。其他人分为代理对,需要2x Char。 99%的时间你不会使用BMP之外的字符。 http://en.wikipedia.org/wiki/UTF-16

现在...... .NET中的StringSystem.Char(末尾有一个NUL终止符)组成,所以它通常是BMP每个字符2个字节(再加上终结者的另外2个字符)。

在Assembly中,字符串保存为UTF-16。我刚刚用十六进制编辑器检查过。它们不是“完全”NUL终止的(它们在0处有一个字节),但是它们的长度(以字节为单位)+ 1(对于0的单字节)作为16位值预先加载。 / p>

答案 1 :(得分:3)

  

减少内存占用[...]最明显的做法是摆脱一些常量字符串(例如错误字符串),以便根据需要将它们从服务器中拉出来。

内存占用量不依赖于您的可执行文件大小。我可以使用几个K的可执行文件来填满你所有的ram。

你认为创建套接字,通过某些协议(如HTTP)请求字符串,只填充一个只需要字符串的数组,不会占用至少与编译成可执行文件的字符串数组一样多的内存吗?

如果有的话,你应该查看条件编译(#if ENGLISH // language specific variables here #endif),因此只包括你需要的字符串,或使用许多国际化选项之一,如cultures

答案 2 :(得分:0)

如果我没记错的话,UTF-8向后兼容ASCII,对大多数常见字符来说,每个字符都是1个字节。

相关问题