我在阅读有关C#中非托管代码的信息,并遇到了以下几行:
在C#程序中,CLR使用字段标记查找偏移量。
C字段名称直接编译为偏移量。对于访问速度,每个字段都放置在一个偏移量处,该偏移量是字段大小的倍数。
但是,该乘数限制为最多x个字节,其中x是“数据包大小”。
我的问题是什么是包装尺寸?
在计算机体系结构中,使事物按字节对齐要快得多。当语言规范谈论数据包大小时,这就是说编译器将根据对齐方式自动为数据大小创建更大的插槽。这意味着有时您认为将是2个字节的字段,实际上可以在内存中的4个字节的插槽中。如果要减少存储大小,以换取CPU速度的降低,可以调整包装大小。
有关详细信息,请检查包装上的msdn。
引用本教程:
从历史上看,存储器是字节可寻址的,并按顺序排列。如果将存储器安排为一个字节宽度的单个存储体,则处理器需要发出4个存储器读取周期来获取整数。在一个内存周期中读取整数的所有4个字节更为经济。为了利用这种优势,如上图所示,存储器将按4个存储体的组进行排列。
内存寻址仍然是顺序的。如果存储区0占用地址X,则存储区1,存储区2和存储区3将位于(X + 1),(X + 2)和(X + 3)地址。如果在X地址上分配了4个字节的整数(X是4的倍数),则处理器仅需要一个存储周期即可读取整个整数。
反之,如果将整数分配给非4的倍数的地址,则该整数将跨越存储体的两行,如下图所示。这样的整数需要两个内存读取周期才能读取数据。
...
变量的数据对齐方式处理这些库中存储的数据的方式。例如,int在32位计算机上的自然对齐为4个字节。自然对齐数据类型后,CPU会以最少的读取周期来获取数据。
同样,short int的自然对齐方式为2个字节。这意味着,一个短整数可以存储在存储区0 –存储区1对或存储区2 –存储区3对中。一个双精度型需要8个字节,并且在存储体中占据两行。double的任何未对齐都会迫使两个以上的读取周期来获取double数据。
请注意,将在32位计算机上的8字节边界上分配一个double变量,并且需要两个内存读取周期。在64位计算机上,根据存储体数量,将在8字节边界上分配double变量,并且只需要一个内存读取周期。
虽然语言不同,但概念相同
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句