我正在尝试解决影响Silverlight应用程序集的编译大小的问题。显然,我想减小应用程序的大小,最明显的做法是摆脱一些常量字符串(例如错误字符串 - 应用程序或其他资源密集型实体中没有图像)。我随后将根据需要从服务器中提取字符串。在我接受这项工作之前,我想弄清楚大概节省的空间。
编译的常量在编译的DLL中占用了多少内存?我假设它被存储为UNICODE UTF-16字符数组,因此每个字符将是2个字节?它是否正确?是否有经验法则(或更严格的规则来计算可以对用于创建最终.xap文件的zip压缩的字符串进行多少压缩?
编辑显然,我提出这个问题的方式引起了一些混乱。我不是说'内存占用'是'应用程序消耗的内存量',而是'dll'的大小,因此也就是创建的xap文件。答案 0 :(得分:4)
我们这样说:.NET中的System.Char
(c#中的char
)是2个字节。它无法表示所有Unicode字符。只有BMP(基本多语言平面)的字符可以由单个Char
表示。其他人分为代理对,需要2x Char
。 99%的时间你不会使用BMP之外的字符。 http://en.wikipedia.org/wiki/UTF-16
现在...... .NET中的String
由System.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个字节。