首页 > 代码库 > 关于结构体的大小
关于结构体的大小
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
关于结构体的大小
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。