关于结构体的大小

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

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

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

下面代码

TRecord2 = record
    a: Integer;
    b: Integer;
    c: Integer;
  end;

 {$A8+}
 TRecord1 = record
    a1: Byte;
    a2: Integer;
    a3: Int64;
    a4: Byte;
    a5: Word;
    case Integer of
      0: (e1: TRecord2);
      1: (e2: Int64);
  end;

直接用数据说话吧:

下面是每个成品的偏移量

a1:0, a2:4, a3:8, a4:16, a5:18, e1:24, e2:24, size:40

其实可以画一个格子<下面每个格子代表对齐的字节数>

a1, a2 a3 a4,a5 e1 e1      

因为对齐都是2的倍数,所以a5是18而不是17.

还有一种比较特殊的

TRecSingle = record
  a1: Byte;
end;

这种大小是1

时间: 2024-12-28 23:02:46

关于结构体的大小的相关文章

关于结构体占用空间大小总结(#pragma pack的使用)

关于C/C++中结构体变量占用内存大小的问题,之前一直以为把这个问题搞清楚了,今天看到一道题,发现之前的想法完全是错误的.这道题是这样的: 在32位机器上,下面的代码中 class A { public: int i; union U { char buff[13]; int i; }u; void foo(){} typedef char* (*f)(void*); enum{red , green, blue}color; }a; sizeof(a)的值是多少?如果在代码前面加上#pragm

关于结构体占用空间大小总结

关于C/C++中结构体变量占用内存大小的问题,之前一直以为把这个问题搞清楚了,今天看到一道题,发现之前的想法完全是错误的.这道题是这样的: 在32位机器上,下面的代码中 class A { public: int i; union U { char buff[13]; int i; }u; void foo(){} typedef char* (*f)(void*); enum{red , green, blue}color; }a; sizeof(a)的值是多少?如果在代码前面加上#pragm

sizeof()计算结构体的大小

简要说明:结构体成员按照定义时的顺序依次存储在连续的内存空间,但是结构体的大小并不是简单的把所有成员大小相加,而是遵循一定的规则,需要考虑到系统在存储结构体变量时的地址对齐问题. 一.没有成员的结构体占用的空间是多少个字节? 答案是:1个字节. 这就是实例化的原因(空类同样可以被实例化),每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类或空结构体(C++中结构体也可看为类)隐含的加一个字节,这样空类或空结构体在实例化后在内存得到了独一无二的地址,所以空类所占的内存

结构体的大小

系统在存储结构体变量时存在地址对齐问题,编译器在编译程序时会遵循两条原则: 一.结构体变量中成员的偏移量必须是成员大小的整数倍: 二.结构体大小必须是所有成员大小的整数倍. 1 #include<stdio.h> 2 3 struct a{ 4 int i; 5 float f; 6 char c; 7 double d; 8 long l; 9 }b; 10 11 int main(){ 12 printf("%d\n",sizeof(b.i));// 4 13 prin

【2017-07-01】Linux应用开发工程师面试问题记录之二:关于结构体的大小及内存对齐问题

Tencent后台服务器开发有一道题是计算一个结构体的sizeof的大小: struct strData { int m_Int; char m_Char; short m_Short; char m_Flag; } 系统为32位的Unix机器,请问sizeof(strData)的值是多少? 在32位系统中,int类型为4个字节,char类型为1个字节,short为2个字节,所以理论上上述结构体占用的空间总共为8个字节: 但是,内存存放数据时如果各种类型合理对齐时,cpu访问数据的效率就比较高:

struct的成员对齐问题-结构体实际大小问题

struct的成员对齐 注意:为了方便说明,等号左边是每个数据单独所占长度,右边是最终空间大小,以字节为单位. 一.什么时间存在对其问题:(32位机对齐方式是按照4字节对其的,以下所有试验都是在32位机上验证的) 当结构体成员数据按照其顺序组合,无法按4字节对齐时,存在对其问题. 如: 1+1=2: 1+2=3: 1+2+1=4(而不是6或者其他): 2+1=3:(不是4) 以上是不存在对其问题的(因为没有超过4字节). 如: 1+4=8: 4+1=8: 1+4+1=12: 1+2+4=8: 1

计算结构体的大小

typedef struct { int num:16; //指定num所占空间为16位,即2字节 }A1; typedef struct { int num:16; //3个16位,本来为6字节,补齐为8字节 int num1:16; int num2:16; }A2; typedef struct { int num:8; //1个8位,本来为1字节,补齐为4字节 }A3; typedef struct { int num:8; //3个8位,本来为3字节,补齐为4字节 int num1:8

计算结构体大小

char类型的长度被定义为一个8位字节,这很简单. short类型的长度至少为两字节.在有些计算机上,对于有些编译程序,short类型的长度可能为4字节,或者更长. int类型是一个整数的“自然”大小,其长度至少为两字节,并且至少要和short类型一样长.在16位计算机上,int类型的长度可能为两字节:在32位计算机上,可能为4字节:当64位计算机流行起来后,int类型的长度可能会达到8字节.这里说的都是“可能”,例如,早期的Motorala 68000是一种16/32位的混合型计算机,依赖于不

sizeof操作符-结构体与类大小

导读 sizeof是C/C++一个难点,当在自定义类上应用sizeof操作符时,总会出现意想不到的结果,下面,我们就来探讨一下sizeof这个操作符! 目录 1. sizeof与strlen的区别 2. sizeof作用于结构体 3. 字节对齐问题 4. sizeof作用于类 正文 1. sizeof与strlen的区别 这是老生常谈的问题了,下面举一个例子大家就明白了. char buf[] = "hello world!"; cout<<sizeof(buf)<&