【C#】举两个结构体内存对齐的小例子

定义结构体:

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值