定义结构体:
struct A{
int a;
float b;
double c;
char d;
short e;
}
struct A字段中占最多字节的是double,为8个字节
所以该结构体的默认对齐值为8(默认对齐值是取字段中最大的那个字节数)
A中第一个字段默认从0开始,
因此
a的位置为0 1 2 3
从b开始需要对开始地址进行计算
(float为4个字节,和默认对齐值相比取最小为4)
因此从下一个4的倍数,即4开始
b的位置为4 5 6 7
(double为8个字节,和默认对齐值相比取最小值为8)
下一个8的倍数为8
c的位置为8 9 10 11 12 13 14 15
(char为2个字节,和默认对齐值相比取值为2)
下一个1的倍数为16
d的位置为16 17
(short为2个字节,和默认对齐值相比取最小值为2)
下一个2的倍数为18
e的位置为18 19
再根据默认有效对齐值8计算占位符
下一个8的倍数为24
所以结构体A的存储大小为24个字节(因为从0-23开始)
下面是嵌套的
using System.Runtime.InteropServices;
struct InnerStruct
{
public byte a; // 1 byte
public int b; // 4 bytes
public double c; // 8 bytes
}
struct OuterStruct
{
public InnerStruct inner; // 嵌套结构体
public byte d; // 1 byte
}
class Program
{
static void Main()
{
Console.WriteLine("Size of InnerStruct: " + Marshal.SizeOf(typeof(InnerStruct)));//结果为16
Console.WriteLine("Size of OuterStruct: " + Marshal.SizeOf(typeof(OuterStruct)));//结果为24
}
}
InnerStruct的默认对齐值为8
byte为1个字节,
a的位置为0
int为4个字节,对比默认对齐值取最小值为4
下一个4的倍数为4
b的位置为4 5 6 7
double为8个字节,对比默认对齐值取最小值为8
下一个8的倍数为8
c的位置为8 9 10 11 12 13 14 15
最后进行内存补齐 即用默认对齐值8计算出下一个8的倍数为16
所以InnerStruct所占字节数为16(0~15)
OuterStruct中包含了InnerStructdui
可以将其拆开看,得出OuterStruct中占字节数最多的字段为double(8个字节)
所以OuterStruct的默认对齐值为8
inner的位置为0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
byte为1个字节,对比默认对齐值后取最小值为1
下一个1的倍数为16
d的位置为16
最后进行内存补齐 即用默认对齐值8计算出下一个8的倍数为24
所以OuterStruct占字节数为24(0~23)