我同意 Joachim 的观点,因为您似乎试图在没有任何证据(例如分析数据)表明您首先需要这样做的情况下过早地优化您的程序。伟大的 Donald Knuth 说过“过早的优化是万恶之源”——牢记在心。
除此之外,第二个问题是分配不是一项昂贵的操作。一般来说,分配在 O(1) 时间内完成。实际的编码操作要贵很多倍。
第三,是的,您的问题有解决方案;但我不明白这一点,因为给定编码的字符串所需的字节数是不可预测的,这就是为什么(默认情况下)Encoding
子类可以自由分配和返回它们自己的缓冲区,因为这意味着你永远不需要如果您的初始调用提供的缓冲区大小不足,请再次使用更大的缓冲区调用该方法。
另一个问题是,.NET 字符串与 C 中以空字符结尾的字符串不同,它具有固定长度并且缺少终止符(.NET 字符串中可以包含空字符,而 C 字符串则不能)。因此,您可能需要在每次使用缓冲区时清除它,这会进一步减慢您的程序:
您需要使用两种方法:Encoding.GetBytesCount(String)
或Encoding.GetBytes(String, Int32, Int32, Byte[], Int32 )
,如下所示:
Encoding encoder = ...
Byte[] buffer = new Byte[1024]; // allocating a 1KB-sized buffer which it is hoped is large enough for every possible string
foreach(String str in stringsToEncode) {
buffer.Initialize(); // reset every byte to zero (your program may need this, or it may not; I don't know enough about it).
Int32 bytesWritten;
do {
try {
bytesWritten = encoder.GetBytes( str, 0, str.Length, buffer, 0 );
} catch(ArgumentException) {
bytesWritten = Int32.MaxValue;
buffer = new Byte[ buffer.Length * 2 ];
}
}
while( bytesWritten == Int32.MaxValue )
}
Of course this code is going to have problems of its own. But you should get the idea.