探究.NET 461中ReadOnlyMemory<T> Length属性的按位与代码原因
为什么ReadOnlyMemory.Length要和int.MaxValue按位与
首先得明确,int.MaxValue的二进制是0x7FFFFFFF——32位整数里最高位是0,剩下31位全是1。
在.NET 4.6.1的ReadOnlyMemory<T>实现里,_length字段不只是存实际内存长度:它的最高位被当成了一个标志位,用来存储额外状态(比如区分当前内存是指向托管数组、非托管内存,还是其他特殊来源)。
当对外提供Length属性时,我们只需要真实的长度数值,所以用this._length & int.MaxValue这个按位与操作,就能把最高位的标志位清掉,只留下低31位的有效长度。
举个直观例子:如果_length的二进制是10000000 00000000 00000000 00001010(最高位1代表特殊状态,低31位是10,也就是实际长度),和int.MaxValue(01111111 11111111 11111111 11111111)按位与后,结果就是00000000 00000000 00000000 00001010,也就是正确的长度10。
这种做法是典型的字段复用优化——不用额外加字段占用内存,靠现有字段的冗余位存储额外状态,对于ReadOnlyMemory<T>这种值类型来说,内存开销的优化很关键。
内容的提问来源于stack exchange,提问作者codymanix
相关产品推荐
相关产品推荐

