码迷,mamicode.com
首页 > 其他好文 > 详细

关于结构体的大小

时间:2014-09-11 22:23:32      阅读:261      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   div   sp   log   on   c   ad   

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

关于结构体的大小

标签:style   blog   color   div   sp   log   on   c   ad   

原文地址:http://www.cnblogs.com/DKSoft/p/3967345.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!