我想知道为什么C#没有long.Parse
版本接受字符串和长度的偏移量。实际上,我被迫首先致电string.Substring
。
这与C strtol
不同,其中首先不需要提取子字符串。
如果我需要解析数百万行,我觉得会产生开销会立即变成垃圾的小字符串。
有没有办法将字符串有效地解析为数字而不在堆上创建临时短寿命垃圾字符串? (基本上以C方式进行)
答案 0 :(得分:2)
除非我读错this,否则strtol
不会在字符串中添加偏移量。它需要一个内存地址,调用者可以将其设置为字符缓冲区内的任何位置(如果它们没有引起注意,则设置在缓冲区外)。
这提出了几个问题:
计算偏移量需要了解字符串的编码方式。我相信c#目前使用UTF16作为内存中的字符串。如果要改变,那么你的抵消就会消失,可能带来灾难性的后果。
对于托管对象,地址的计算很容易变得陈旧,因为它们没有固定在内存中 - 它们可以随时由内存管理来移动。你必须使用类似GCHandle.Alloc的内容将其固定在内存中。当你完成后,你最好解开它,否则你可能会遇到严重的问题!
如果您的地址有误,例如在你的缓冲区之外,你的程序可能会爆炸。
我认为C程序员更习惯于自己管理内存映射对象,并且没有问题计算偏移量和地址,并且像装配一样使用它们进行修改。使用像c#这样的托管语言,这些东西需要更多的工作而且通常不会完成 - 我们将内容固定在内存中的唯一一次是我们必须将对象传递给非托管代码。当我们这样做时,it incurs overhead。如果您的总体目标是提高绩效,我不会建议。
但如果你真的想要了解这个问题,你可以尝试this solution,其中一个聪明的c#程序员会将字符串作为ASCII编码字节数组读取并根据数据计算数字那。通过他的解决方案,您可以指定start
和length
到您的内心。如果你的字符串是用UTF编码的,你必须写一些不同的东西。我会走这条路,而不是试图破解string
对象的内存映射。