首页 > 代码库 > 关于结构体的大小

关于结构体的大小

TRecord2 = record    a: Integer;    b: Integer;    c: Integer;  end;  TRecord1 = record    a: Byte;    case Integer of      0: (a1: TRecord2);      1: (a2: Int64);  end;

 

第一步是要知道结构体大小的计算方式:

     结构体大小等于最后一个成员的偏移量加上最后一个成员的大小,

    偏移量指的是结构体变量中成员的地址 - 结构体变量地址的差, 第一个成员的偏移量为0

 

实际上,由于存储变量时地址对齐的要求, 编译器在编译程序时会遵循两条原则:

一、结构体变量中成员的偏移量必须是成员大小的整数倍(0被认为是任何数的整数倍)

二、结构体大小必须是所有成员大小的整数倍。

 

SizeOf(TRecord2) = 12

a:的偏移量是0,

b:的偏移量是4

c:的偏移量是8

大小是最后一个变量的偏移量+ 最后一个成员的大小 8 + 4 = 12

 

sizeOf(TRecord1) = 24;

结构体中包含结构体,要展开这个结构体

  TRecord1 = record    a: Byte;    a2: Int64;  end;    TRecord1 = record    a: Byte;    a2.TRecord2.a:Integer;    a2.TRecord2.b:Integer;    a2.TRecord2.c:Integer;  end;

要确定a2的偏移量,a2的偏移量从第一种情况来看应该是

一、结构体变量中成员的偏移量必须是成员大小的整数倍

a2的偏移量应该是8

然后确定a2的大小, 从第一种情况看a2的大小是8,第二种情况是12,我们取大的

算出来是8 + 12

二、结构体大小必须是所有成员大小的整数倍。

20 不是8的整倍数,所以应该是24

关于结构体的大小