isbits联合优化
在朱莉娅, 阵列 类型既包含"位"值,也包含堆分配的"盒装"值。 区别在于值本身是否内联存储(在数组的直接分配内存中),或者数组的内存只是指向其他地方分配的对象的指针集合。 就性能而言,内联访问值显然比必须遵循指向实际值的指针更具优势。 "Isbits"的定义通常意味着任何具有固定,确定大小的Julia类型,意味着没有"指针"字段,请参阅 ?等位类型.
Julia还支持联合类型,确切地说是一组类型的联合。 自定义联合类型定义对于希望"跨越"名义类型系统(即显式子类型关系)并在这些(否则不相关的)类型集上定义方法或功能的应用程序来说非常方便。 然而,编译器的一个挑战是确定如何处理这些联合类型。 天真的方法(实际上,Julia本身在0.7之前所做的)是简单地制作一个"盒子",然后在盒子中创建一个指向实际值的指针,类似于前面提到的"盒装"值。 然而,这是不幸的,因为小而原始的"位"类型的数量(想想 UInt8, Int32, 漂浮64 等。)这将很容易地将自己内联在这个"盒子"中,而不需要任何间接的值访问。 从0.7开始,Julia可以通过两种主要方式利用这种优化:类型中的Isbits联合字段和isbits联合数组。
isbits联合结构
Julia现在包括一个优化,其中"isbits Union"字段在类型(可变结构, 结构体 等。)将内联存储。 这是通过确定联合类型的"内联大小"来实现的(例如 工会{UInt8, Int16} 将具有两个字节的大小,其表示最大联合类型所需的大小 Int16),此外,分配一个额外的"类型标记字节"(UInt8),其值表示"联合字节"内联存储的实际值的类型。 类型标记字节值是联合类型的类型顺序中实际值类型的索引。 例如,类型标记值为 0x02 对于具有类型的字段 工会{Nothing, UInt8, Int16} 会表明一个 Int16 值存储在结构内存中字段的16位中; 0x01 值将表明,一个 UInt8 值被存储在字段的存储器的16位的前8位中。 最后,一个值 0x00 信号,该 什么都没有 将为此字段返回值,即使作为具有单个类型实例的单例类型,它在技术上的大小为0。 类型的联合字段的类型标记字节直接存储在该字段的计算联合内存之后。