我引用Herbert Schildt第3章的数据类型、变量和数组:
基元类型表示单个值,而不是复杂对象。虽然Java在其他方面是完全面向对象的,但原语类型却不是。这种效率的原因。制造原始类型会大大降低性能。 原语类型被定义为具有显式范围和数学行为。C、C++等语言允许整数的大小根据执行环境的要求而变化。然而,Java是不同的。由于Java的可移植性要求,所有数据类型都有一个强定义的范围。例如,int总是32位,而不考虑特定的平台。这允许编写保证在任何机器架构上不进行移植就能运行的程序。虽然在某些环境中严格指定整数的大小可能会导致性能的小损失,但为了实现可移植性,这是必要的。
他说最后两行是什么意思?为什么在某些环境中指定整数的大小会导致性能的小损失呢?
发布于 2014-08-26 05:31:23
在“低级”语言中,原始数据类型大小通常来自CPU处理它们的能力。例如,在C中,int被定义为“至少16位大小”,但其大小在不同的体系结构中可能有所不同,以确保“int类型应该是目标处理器最有效处理的整数类型。”(来源)。这意味着,如果您的代码对int的大小做了粗心的假设,如果您将其从32位x86移植到64位powerpc,它很可能会中断。
如上所述,java是不同的。例如,一个int总是32位。这意味着,当您在不同的架构上运行相同的代码时,您不必担心它的大小会发生变化。正如上面所提到的,代价是性能--在任何本机不处理32位计算的体系结构上,这些int需要扩展到CPU可以处理的本机大小(这将带来很小的损失),或者更糟的是,如果CPU只能处理较小的int,那么int上的每个操作可能需要几个CPU操作。
发布于 2014-08-26 05:35:45
一些(非常少的) 计算机使用36位结构。,所以您需要额外的一步来屏蔽比特,模拟溢出,等等。
发布于 2014-08-26 05:27:51
AFAIK,在java中没有办法定义整数的大小。在这里,它始终是32位int作为提到过。但是一些编程语言可能允许指定整数的大小(Ex: Ada)。
当编译器试图将代码转换为machine code instructions时,会出现性能问题(请参阅这里和这里)。通常,机器代码指令是32位或64位。如果我们的into与机器代码中的大小相同,那么很容易将它们转换为机器代码。否则,编译器需要付出额外的努力将它们转换为机器代码。这就是性能问题出现的时候。
https://stackoverflow.com/questions/25498512
复制相似问题