转载:http://blog.csdn.net/rznice/article/details/6566978

  第一种不带packed关键字的结构体表明编译器编译时要求进行字对齐。

  而第二种带packed关键字的结构体表明编译器编译结构体的时候不需要进行字对齐,这种方式对结构中的字段访问回避第一种方式慢!但是更节约空间。

  所以归纳来说,有packed的占用内存小,但是速度慢一点。没有packed的占用内存大,但是速度快一点

  比如

TA = record
a : char;
b : integer;
end;

  和

TB = packed record
a : char;
b : integer;
end;

  中,TA.b位于TA结构开始出的第五个字节,TB.b位于TB结构开始处的第二个字节,即TA结构中在TA.a和TA.b之间插入了3个无用字节,因为TA.b在内存中的地址是按字对齐的---即这个地址能被4整除,而TB中则没有这些无用字节,但是TB.b不是字对齐的,对他的访问比对TA.b慢。

  例子1

type
t = packed record
a : char; //1个字节
d : double; //8个字节
b : smallint; //4个字节,虽然本来smallint是2个字节,但是因为如果一个变量没有4个字节宽的话也要占4个字节,所以现在要补宽到4个字节
end; //所以sizeof(t) = 13

  和

type
t = record
a : char; //8字节,因为a的长度不够8个字节,而紧邻着的d 为一个字(8个字节),所以要补齐8
d : double; //8字节
b : smallint; //8字节
end; //sizeof(t)=24

  例子2

type
t = record
a : char; //1个字节
b : smallint; //2个字节
d : double; //8个字节
end; //sizeof(t)=13

  和

type
t = record
a : char; //因为a的长度为1个字节,后面的b为两个字节,累加起来是3个字节
//再后面的d为8个字节,所以a+b要补齐到8个字节
b : smallint; //a+b共占8个自己
d : double; //8个字节
end; //sizeof(t) = 16;

  在windows中内存的分配一次是4个字节。而packed按字节进行内存的申请和分配,这样速度要慢一点,因为需要额外的事件来进行指针的定位。

  因此如果不用packed的话,Delphi将按一次4个字节的方式申请内存,因此如果一个变量没有4个字节宽的话也要占4个字节

最新文章

  1. 经验分享:CSS浮动(float,clear)通俗讲解
  2. android.content.SharedPreferences.edit()
  3. BZOJ3189 : [Coci2011]Slika
  4. 进程、线程、socket套接字-资源大小 & 切换代价
  5. C语言连接Oracle (转载)
  6. 使GridView可以单行横向滑动
  7. ASP.NET菜鸟之路之Seesion小例子
  8. C 运算符与表达式
  9. (Problem 72)Counting fractions
  10. zoj1797 Least Common Multiple 最小公倍数
  11. PF_RING install in centos7
  12. django笔记整理
  13. git工作流程一览
  14. JS“盒子模型”
  15. [Leetcode]100. Same Tree -David_Lin
  16. document.documentElement.clientHeight和document.body.clientHeight区别
  17. CF 1033 D. Divisors
  18. android ContentObserver内容观察者基本使用
  19. laravel 文件上传
  20. 20145122《Android开发基础》实验四实验报告

热门文章

  1. Linux之编译需要的文件变化时刻
  2. JQ库函数记忆要点
  3. 分享一个快速设置背景的js 自动获取背景图的长宽
  4. 绝对实用 NAT + VLAN +ACL管理企业网络
  5. SQL 数据库初学笔记一
  6. Tip
  7. centos终端中mysql中文显示乱码的处理
  8. memcache的带图形界面监控工具memcachephp
  9. 基础知识(javaWeb工程目录结构)及各文件夹的作用
  10. java一维数组