gpt4 book ai didi

java - 为什么栈帧中局部变量数组的每个槽都是 4 个字节,而不是 JVM 中的 1 个字节?

转载 作者:行者123 更新时间:2023-12-02 12:27:46 33 4
gpt4 key购买 nike

局部变量数组的每个槽都是 4 个字节。因此,要存储字符、短变量或字节变量,需要使用一个槽。意味着所有较小的数据类型在内部都会转换为 int 数据类型。

我的疑问是:

1).如果较小的数据类型在内部是 4 字节,这是否不会使它们变得无用?如果是,为什么不从语言中删除此类数据类型? 2)。如果每个槽都是 1 字节,那么就不会浪费内存。为什么每个槽不都是 1 字节呢?

最佳答案

1). Is it not making smaller data types useless, if internally they are of 4-bytes?

当涉及到局部变量或算术时,是的,使用较小的数据类型可能毫无用处,甚至由于所需的值集转换而浪费性能。

但是,除了局部变量之外,还有一个,对于字段和数组,它可以产生(特定于实现的)差异。

If yes, Why not remove such data-types from the language?

首先,如上所述,有堆。其次,有 I/O。您正在以字节或字符或现在的代码点的形式与外界交换数据。因此,除了存储大小之外,这些数据类型还带有语义。无论您调用 StringBuilder.append(char) 还是 StringBuilder.append(byte),都会产生巨大的差异,尽管在这两种情况下,都是一个 int值确实被传递了。

2). If each slot is of 1-byte then there will be no wastage of memory. Why not each slot is of 1-byte?

如果每个槽都是一个字节,则不可能在其中存储任何其他内容。您将堆栈帧槽(用于局部变量和操作数堆栈)与实际存储混淆了。槽旨在保存任意数据类型的值,并且可以以依赖于实现的方式映射到实际存储器或CPU寄存器。 longdouble 消耗两个槽的事实是历史性的妥协,源于 Java 是在上世纪 90 年代初设计的。

如果今天设计的话,你可以打赌,一个槽将被定义为能够容纳所有数据类型,包括longdouble。这里的关键点是架构的简化。如果对局部变量或特定底层架构的操作数使用较小的数据类型有潜在的好处,则由 JVM 实现来检测这一点并生成适当的 native 代码。如前所述,在大多数情况下,由于局部变量和操作数堆栈条目被映射到 CPU 寄存器,因此没有这样的好处。

关于java - 为什么栈帧中局部变量数组的每个槽都是 4 个字节,而不是 JVM 中的 1 个字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39226918/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com