- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
众所周知,C++ bool
的大小必须至少为1个字节,以便可以为每个[https://stackoverflow.com/a/2064565/7154924]创建指针。但是在Java中没有指向原始类型的指针。但是,它们仍然占用至少1个字节的 [https://stackoverflow.com/a/383597/7154924]。
为什么会这样-为什么Java boolean
的大小不能为1位?抛开计算时间,如果一个人有一个较大的boolean
数组,那么肯定可以设想一种编译器,该编译器会进行适当的移位以检索与boolean
值相对应的单个位吗?
最佳答案
没有理由为什么 boolean 值必须为一个字节。实际上,在某些情况下, boolean 值的有效大小可能已经不是1个字节了:当在堆栈或对象中紧挨着大于1个字节的其他元素排成一行时,它们可能会更大(即,添加它们到一个对象可能会导致大小增加一个以上的字节)。
任何JVM都可以自由地将 boolean 值实现为1位,但是据目前尚无人选择这样做,这可能主要是因为:
and
指令,以从 boolean 位的压缩字节(或较大字)中提取相关位。有些人甚至可能需要一条额外的指令才能将常量加载到and
。在为boolean, where the bit-index isn't fixed at compile-time, you'd need a variable shift. Some CPUs such as x86 have an easier time since they have memory source
数组建立索引的情况下,请测试instructions, including specific bit-test instructions taking a variable position such as
bt`。在这两种表示形式中,此类CPU可能具有相似的读取性能。boolean
值。某些平台(例如x86)具有内存源和目标RMW指令(例如and
和or
)会有所帮助,但它们仍然比普通写入昂贵得多。在最坏的情况下,重复写入同一元素将导致通过内存的依赖链,这可能会使您的代码速度降低一个数量级(一系列普通存储无法形成依赖链)。boolean
值时,您才会看到节余(例如,对象通常对齐8字节边界,因此,如果您的对象的非 boolean 字段为int
或更大,则可以至少需要4个boolean
值来节省空间,而且通常需要8)。 boolean
数组中的位表示形式boolean
留下了最后一个“大赢家”,对于大型数组,您可以在其中节省8倍的渐近空间。实际上,这种情况在C++世界中具有足够的动机,因此vector<bool>
有一个“特殊”实现,其中每个bool
都花了一点点-由于所有必需的特殊情况和非直觉的行为(而且经常使用),头痛无休止作为目前无法删除的功能失调的示例)。boolean
数组。他们没有vector<bool>
相同的问题(主要是由于JIT提供了额外的抽象层,并且还因为数组提供了比vector
更为简单的接口(interface)),因此可以高效地完成此工作。虽然有讨厌的内存模型。该模型允许通过不同线程完成对不同数组元素的写入操作(即,出于内存模型的目的,它们充当自变量)。如果您将boolean
实现为字节,则所有通用CPU都直接支持此功能,因为它们具有独立的字节访问权限。但是,没有CPU提供独立的位访问:您被困在原子操作上(x86提供lock bt*
操作,但是速度很慢:其他平台的选择甚至更糟)。这将破坏任何实现为位数组的 boolean 数组的性能。 boolean
会有很大的缺点-但是有什么好处呢?
byte
中(或32个值打包到
int
或其他任何值中)(这对于标志是常见的,等等),并且所生成的访问器代码的效率应该与JVM本地支持的boolean一样高效。 -按位。实际上,当您知道要为大量 boolean 值使用位数组表示形式时,可以简单地使用
BitSet
-它具有所需的表示形式,并且通过不提供任何线程安全保证来避免原子性问题。因此,通过将
boolean
实现为一个字节,可以避免上述所有问题,但是如果需要,仍可以让用户“选择加入”位级表示,而不会花费很多运行时间。
关于java - 为什么Java boolean 值必须至少为1个字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47732906/
我需要一个带有条件的正则表达式: 最少 6 个字符,最多 50 个字符 必须包含 1 个字母 必须包含 1 个数字 可能包含特殊字符,例如!@#$%^&*()_+ 目前我有模式:(?!^[0-9]*$
我想检查密码是否至少包含一个字母和一个数字。接受特殊字符但不是必需的... 那将是一个简单的密码检查器。 最佳答案 您可以使用先行断言来检查任何数字和任何字母的存在,如下所示: ^(?=.*[a-zA
我需要找到生产至少三种不同型号电脑的制造商。结果集:制造商、型号数量。 我的 table 是产品(制造商、型号、类型)PC(代码、型号、速度、内存、高清、CD、价格) 我现在已经这样做了 SELECT
在我正在处理的哈希字典中,根据 GDB,数组的大小已从 500 调整到 1000。它在尝试添加时崩溃的数组索引是 799,所以它没有超出范围......我不是确定它为什么会出现段错误,尤其是在这样一条
我需要一个正则表达式来检查字符串的长度是否至少为 10 个字符。这些字符是什么并不重要。 谢谢 最佳答案 您可以使用: .{10,} 自 .默认情况下不匹配换行符,您必须使用合适的修饰符(如果您的正则
我有以下代码: val num1: Int? = someObject.number val num2: Int? = anotherObject?.anotherNumber val numToFa
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我一直在进行查询以获取用户列表及其各自的组。我知道了。 但是有一些限制: 如果用户只是 group5 的成员,则不应出现在列表中 如果是 group5 和其他组的成员,它应该出现在列表中 我可以获得不
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
我需要忽略任何一个空格,并且应该匹配至少大于一个空格的空格... "MARY HAD A LITTLE LAMB" 我希望 "MARY", "HAD A LITTLE", "
如何在仅数字验证中允许空格(至少 8 位数字)?当允许空格时,输入电话号码会更容易。例如0400 123 456、9699 1234。 到目前为止,这是我的代码,我只进行了最少 8 位数字验证: jQ
我想将以下内容重写为 HTML 模式: if (/\S/.test(myString)) { // string is not empty and not just whitespace }
我的想法是使用 php 或 js 创建大量的 div。 (我从昨天开始写js。) 所以我自己给定的任务是使用 php 或 js 或两者生成一个 div 网格。到目前为止的想法是有一个通用的 div 作
显示字符串中至少有 10 个数字字符的正则表达式。 可以多于 10 个,但不能少于 10 个。在随机位置可以有任意数量的其他字符,将数字分隔开。 示例数据: (123) 456-7890 123-45
我目前在 Firefox 中使用边框动画时遇到问题,从无到 50px。 Chrome 非常好,但 Firefox 不是,我想同样的问题也会出现在 Opera 中。 这里有一个 fiddle 来向您展示
作为 ruby 挑战训练的一部分,我被要求创建一个方法 substrings(string),它将接受一个字符串,并返回一个包含所有子字符串的数组。 即 substrings("cat") #=>
我目前有这段代码,它检查数组中的所有元素是否相同。如果是这种情况,则返回 true def all_equal(lst): """ >>> all_equal([1,1,1,1,1,1,1])
当我注意到 Libre Office 电子表格显示远低于 2^53 的数字的错误值时,我正在做一些计算以计划改进我的主要筛选器的实现,这是 FoxPro 和许多其他精确整数计算的限制内部使用 C do
我有一个复选框,我想检查用户是否填写了它后面的文本框。必须至少包含 5 个字符才能选中复选框。 pro)) echo 'checked' ?>> pro?>">Please supply your I
我正在为我的食谱设计一个数据库。我在我的设计中创建了多个表格:书籍、作者、食谱、成分,对于所有这些项目,我想将媒体(图像或视频)链接到所有这些表格中的项目。 我在想这样的设计: media_id, r
我是一名优秀的程序员,十分优秀!