为什么Ruby有Fixnums和Bignums的单独数据类型,但不是字符串和非常长的字符串?

Rob*_*bin 0 ruby

我想到的第一个想法是Ruby只为字符串分配了一大块内存 - 但是,当然,这看起来非常低效,因此不太可能.

这对我的编程没有直接影响,但我很好奇.谢谢!

bep*_*ter 6

非常粗略地,Fixnums表示计算机可以存储在处理器寄存器中并执行基本算术的数字.Bignums是必要的,因为它们表示根据定义不能存储在单个寄存器中的数字,因此需要"特殊"处理,称为任意精度算术,以便对它们执行算术运算.

在计算机科学中,任意精度算术,也称为bignum算术[...]表示对精度数字仅受主机系统可用内存限制的数字执行计算.这与大多数算术逻辑单元(ALU)硬件中的更快的固定精度算法形成对比,后者通常提供8到64位的精度.

对于字符串,没有这样的区别.任意长的字符串从不在处理器指令级别对其执行算术,因此没有理由区分"短"字符串和"长"字符串.

关于记忆:

(小)数字可以直接作为实际的二进制CPU指令进行操作,因为它们完全适合单个CPU内存地址(称为寄存器).

(大)数字和字符串都不能,因为它们会溢出处理器的"位数".(这就是"64位处理器"的含义:单个数值可以表示和操作,最高可达64位.)

字符串在内存中分配为一系列代表字符的数字(不同的数字代表不同的字符,具体取决于所选的编码,如UTF-8或ASCII),它们跨越多个内存位置.字符串永远不会通过CPU作为原子单位提供,而Fixnums则是.

Bignums同样不能在ALU中处理,因为每个值(可能)占用的内存比单个CPU寄存器中可用的内存多,所以一个单独的包定义了必要的数学运算来分解非常大的数字,执行算术运算使用ALU和复合材料的较小部件,各个答案必须分开编写.

  • 当Fixnums变得足够大时,它们会透明地升级为Bignums.Bignums比Fixnums慢得多,因此Ruby希望尽可能使用Fixnums.您应该了解CPU(或更准确地说,ALU)如何进行算术运算; 它应该具有启发性. (2认同)