作者
Björn Gustavsson <bjorn(at)erlang(dot)org>
状态
最终/R12B-0 提案已在 OTP R12B-0 版本中实现
类型
标准跟踪
创建于
2007-08-10
Erlang 版本
OTP_R12B-0

EEP 6:用于元组和二进制大小的新 BIF #

摘要 #

此 EEP 描述了两个新的保护 BIF tuple_size/1byte_size/1,作为 size/1 BIF 的首选替代方案。

规范 #

byte_size/1::bitstring() -> integer()

返回存储整个位串所需的字节数(参见 EEP 4)。此 BIF 将返回与 (bit_size(Bin)+7) div 8 相同的值(即,如果位数不能被 8 整除,则字节数将向上取整)。此 BIF 允许在保护中使用。

tuple_size/1::tuple() -> integer()

返回元组的大小。如果传递的任何内容不是元组,则此 BIF 将失败。此 BIF 允许在保护中使用。

原理 #

size/1 BIF 接受二进制或元组,并返回二进制的字节大小或元组的大小。

由于 size/1 接受两种不同的类型,因此在编译器和运行时系统中难以优化它的使用。添加这两个新的 BIF 将有助于优化,并且还将帮助 Dialyzer。

可以认为 byte_size/1 应该只适用于二进制文件(位大小可以被 8 整除的位串),以捕获代码无法处理一般位串并且仍然不使用 is_binary/1 保护测试的错误。在我看来,如果程序员必须将 bit_size/1 的结果向上取整到整数个字节,他或她更有可能犯那个错误:“显而易见”的表达式 bit_size(B) / 8 + 1bit_size(B) div 8 + 1 都是错误的,而正确的表达式 (bit_size(B)+7) div 8 并非一目了然。

实现 #

实现很简单。

向后兼容性 #

需要更改包含名为 tuple_size/1byte_size/1 的本地函数的代码。

编译器将发出警告,指出 size/1 已弃用,并且将在 R14B 中删除使用 size/1 的代码。