Java中的原始数据类型和可移植性

时间:2014-08-26 05:15:03

标签: java

我引用Herbert Schildt的第3章数据类型,变量和数组:

  

基元类型表示单个值而不是复杂对象。   虽然Java完全是面向对象的,但原始的   类型不是。这种效率的原因。制作原始   类型会使性能降低太多。

     

原始类型被定义为具有明确的范围和   数学行为。 C,C ++等语言允许的大小   整数根据执行环境的指示而变化。   但是,Java是不同的。由于Java的可移植性要求,   所有数据类型都有一个强烈定义的范围。例如,int是   无论特定平台如何,总是32位。这允许   要编写的程序,保证在不移植的情况下运行   任何机器架构。同时严格指定一个的大小   在某些环境中,整数可能会导致性能的轻微损失   为了实现便携性是必要的。

最后两行是什么意思?如何指定整数的大小可能会导致某些环境中的性能损失很小?

4 个答案:

答案 0 :(得分:8)

In" lower"语言,原始数据类型大小通常来自CPU处理它们的能力。 例如,在中,int被定义为"大小至少为16位",但其大小可能因架构而异,以确保" type int应该是目标处理器最有效的整数类型。" (source)。这意味着,如果您的代码对int的大小做了粗心的假设,那么如果您将其从32位移植到64位,则可能会中断

如上所述,

是不同的。例如,int将始终为32位。这意味着当您在不同的体系结构上运行相同的代码时,不必担心其大小会发生变化。如上所述,权衡是性能 - 在任何本身不处理32位计算的架构上,这些int需要扩展到CPU可以处理的本机大小(将具有(如果CPU只能处理较小的int s,int上的每个操作都可能需要多次CPU操作。

答案 1 :(得分:3)

一些(极少数)computers use 36 bit architecture,因此您需要额外的步骤来屏蔽掉位,模拟溢出等。

答案 2 :(得分:2)

AFAIK,java中没有办法定义整数的大小。它总是一个32位的int mentioned。但是一些编程语言可能允许指定整数的大小(例如:Ada)。

编译器尝试将代码转换为machine code instructions时会出现性能问题(请参阅herehere)。通常机器代码指令是32位或64位。如果我们的int与机器代码中的大小相同,则很容易将它们转换为机器代码。否则编译器需要付出额外的努力将它们转换为机器代码。当性能问题出现时。

答案 3 :(得分:2)

Java在底层系统的指针机制的顶部实现了自己的数据指针机制。如果数据不够大,许多系统可能会使用较小的指针。

对于ex:如果整数数据只需要16位指针,系统将仅分配使用16位指针所需的存储空间。但是如果你使用Java,它会将16位转换为32位指针分配,这需要大的内存空间,这也会降低 storage <的性能em>数据搜索 。因为你的指针是