C#中sizeof方法
用于获取 值类型 的字节大小。https://msdn.microsoft.com/zh-cn/library/eahchzkf(VS.80).aspx
对于所有其他类型(包括 struct),sizeof 运算符只能在不安全代码块中使用。虽然可以使用 SizeOf 方法,但该方法返回的值和 sizeof 返回的值并不总是相同的。Marshal.SizeOf 在已封送处理类型后返回大小,而 sizeof 返回公共语言运行库分配的大小(包括任何空白)。
计算struct大小
public struct StructTest
{
public char a;
public int b;
public char c;
public double d;
public char e;
}
输出
32位:32
64位:32
这个很奇怪!!!不太懂
内存对齐。计算机系统对基本类型在内存中存放的位置进行限制,要求这些数据的首地址是某个数的倍数(4或8),这个数叫做对齐模数。ANSI C标准并没有规定,相邻的变量在内存中一定要相邻,内存对齐问题有编译器自行灵活处理。32位系统最大对齐模数是4,因为一次最大读取32位。
对齐原因:
(1)平台原因:不是所有的硬件平台都能访问任意地址上的任意数据,某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
(2)性能原因:数据结构应尽可能的在自然边界上对齐。为了访问未对齐的内存,处理器需要做两次内存访问,而对齐的内存访问仅需要异常访问。
对齐规则:
1)结构体或union联合的数据成员,第一个数据成员是要放在offset==0的地方,如果遇上子成员,要根据子成员的类型存放在对应的整数倍的地址上。
2)如果结构体作为成员,则要找到这个结构体中的最大元素,然后从这个最大成员的整数倍地址开始存储。
如果想忽略为了对齐而填充补上的部分,可以使用[StructLayout]特性,可以选择Auto、Explicit、Sequential三种对齐方式
[StructLayout(LayoutKind.Auto)]
public struct StructTest
{
public char a;
public int b;
public char c;
public double d;
public char e;
}
输出
32位:20=a(2)+b(4)+c(2)+d(4+4)+e(2)+2,补齐,对齐模数=4
64位:24=a(2)+b(4)+c(2)+d(8)+e(2)+6,补齐,对齐模数=8
计算枚举类型enum大小
class Program
{
static void Main(string[] args)
{
Console.WriteLine(sizeof(MyEnum1));
Console.WriteLine(sizeof(MyEnum2));
Console.WriteLine(sizeof(MyEnum3));
Console.ReadKey();
}
enum MyEnum1
{
}
enum MyEnum2
{
C1 = 1,
}
enum MyEnum3
{
C1 = 1,
C2 = 2
}
}
返回值均为4,枚举是为了更好的定义常量,优点是常量值是自动生成的,这些常量可以用int范围数表示,所以sizeof(enumType)=sizeof(int)=4。
Marshal.SizeOf()方法
返回类的非托管大小(以字节为单位)。