1

我已经听过很多次了,我认为这是理所当然的。但是回想一下,有人能帮我理解为什么字符串操作,比如比较等,比说整数或其他一些原语更昂贵吗?

4

4 回答 4

3

8位示例:

1 位可以是 1 或 0。使用 2 位可以表示 0、1、2 和 3。依此类推。使用一个字节,您有 2^8 种可能性,从 0 到 255。

在字符串中,单个字母存储在一个字节中,因此“Hello world”是 11 个字节。

如果我想做 100 + 100,100 存储在 1 个字节的内存中,我只需要两个字节就可以将两个数字相加。结果将再次需要 1 个字节。

现在让我们尝试使用字符串“100”+“100”,这是 3 个字节加上 3 个字节,结果“100100”需要存储 6 个字节。

这被过度简化了,但或多或​​少是以这种方式工作的。

于 2013-10-08T17:08:01.247 回答
2

C# 中的int数据类型经过精心挑选,以与处理器设计完美匹配。它可以将 int 存储在 cpu 寄存器中,该存储位置比内存快 3 倍。以及用于比较 int 类型值的单个 cpu 指令。CMP 指令在不到一个 cpu 周期内运行,不到一纳秒。

这对字符串几乎不起作用,它是一种可变长度的数据类型,必须比较字符串中的每个字符以测试是否相等。因此,它会根据字符串的大小自动按比例变慢。此外,字符串比较受文化相关比较规则的影响。使德语中的“ss”和“ß”相等,丹麦语中的“Aa”和“Å”相等的那种。无需处理任何微妙的事情,由 CLR 中高度优化的表驱动代码处理。它无法击败CMP。

于 2013-10-08T17:19:44.623 回答
0

在查看操作字符串的“成本”时,需要考虑几件事。有内存使用成本,有使用的 CPU 周期成本,还有与所涉及代码的复杂性相关的成本。

整数操作(加、减、乘、除、比较)通常由 CPU 在硬件级别完成,只需几条(甚至 1 条)指令。操作完成后,答案会回到相同大小的内存块中。

字符串存储在内存块中,必须一次操作一个字节或一个字。比较两个 100 个字符长的字符串可能需要 100 次单独的比较操作。

任何使字符串变长的操作都需要将字符串移动到更大的内存块,或者在内存中移动其他东西以允许增长现有块。

如果语言允许,任何使字符串保持不变或更小的操作都可以就地完成。如果不是,则必须再次分配新的内存块并移动内容。

于 2013-10-08T17:31:42.843 回答
0

我一直认为这是因为字符串的不变性。也就是说,每次对字符串进行更改时,都需要为全新的字符串分配内存(而不是原地修改原始字符串)。

可能是一种可悲的幼稚理解,但也许其他人可以进一步阐述。

于 2013-10-08T16:55:45.513 回答