C# 包装尺寸是多少?

C# 包装尺寸是多少?,c#,.net,unmanaged,C#,.net,Unmanaged,我在读C#中的非托管代码时,遇到了以下行:- 在C#程序中,CLR使用字段标记查找偏移量。 C字段名直接编译成偏移量。对于访问速度,每个字段的偏移量是字段大小的倍数。 但是,该乘数的最大值限制为x字节,其中x是“包大小” 我的问题是什么是包装尺寸 在计算机体系结构中,让事情变得简单要快得多。当语言规范谈到包大小时,这就是说编译器将根据数据大小的对齐方式自动创建更大的插槽。这意味着有时您认为是2字节字段的内容实际上可以位于内存中的4字节插槽中。如果您想减少存储大小,作为cpu速度降低的交换,您可以

我在读C#中的非托管代码时,遇到了以下行:-

在C#程序中,CLR使用字段标记查找偏移量。
C字段名直接编译成偏移量。对于访问速度,每个字段的偏移量是字段大小的倍数。
但是,该乘数的最大值限制为x字节,其中x是“包大小”


我的问题是什么是包装尺寸

在计算机体系结构中,让事情变得简单要快得多。当语言规范谈到包大小时,这就是说编译器将根据数据大小的对齐方式自动创建更大的插槽。这意味着有时您认为是2字节字段的内容实际上可以位于内存中的4字节插槽中。如果您想减少存储大小,作为cpu速度降低的交换,您可以调整包大小

查看包装上的更多信息

引用这句话:

历史上,内存是字节可寻址的,并按顺序排列如果 内存被安排为一个字节宽的单组,处理器 需要发出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中 一对double需要8个字节,并占用内存中的两行 银行。double的任何未对准都会导致两个以上的读取周期 获取双重数据

注意,一个双变量将在32的8字节边界上分配 位机器,需要两个内存读取周期。在64位机器上, 根据银行数量,将在8字节上分配双变量 边界,只需要一个内存读取周期


虽然语言不同,但概念是相同的

我将以devshorts引用的字段对齐细节为例。包大小设置是编译器停止尝试保持字段对齐的位置,因为它太大了

它是编译器设置或本机代码中的#pragma。在英特尔处理器上,这是一个棘手的问题,因为它们非常灵活,允许数据不对齐,几乎没有任何惩罚。包大小为8是非常常见的默认值,几乎总是正确的。有时是1或4。[StructLayout]声明中的Pack属性必须匹配,如果不匹配,则很有可能读取垃圾,因为您将在错误的内存位置读取字段