packed record与record区别
在windows中内存的分配一次是4个字节的。而packed按字节进行内存的申请和分配,这样速度要慢一些,因为需要额外的时间来进行指针的定位。因此如果不用packed的话,delphi将按一次4个字节的方式申请内存,因此如果一个变量没有4个字节宽的话也要占4个字节!这样就浪费了,你可以用packed关键字取消这种优化。
例子:
type
myrec = packed record
n1 : integer; 4个字节
n2 : shortint; 1个字节
end;
sizeof(myrec)------ 5
type
myrec = record
n1 : integer;
n2 : shortint;
end;
sizeof(myrec)------ 8
Record的数据各个字节都是对齐的,数据格式比较完整,所以这种格式相对packed占用的内存比较大,
但是因为格式比较整齐,所以电脑读取这个类型的数据的时候速度比较快。
而Packed Record对数据进行了压缩,节省了内存空间,当然他的速度也变的慢了。
type
// Declare an unpacked record
TDefaultRecord = Record
name1 : string[4];
floater : single;
name2 : char;
int : Integer;
end;
// Declare a packed record
TPackedRecord = Packed Record
name1 : string[4];
floater : single;
name2 : char;
int : Integer;
end;
var
defaultRec : TDefaultRecord;
packedRec : TPackedRecord;
begin
ShowMessage('Default record size = '+IntToStr(SizeOf(defaultRec)));
ShowMessage('Packed record size = '+IntToStr(SizeOf(packedRec)));
end;
Default record size = 20
Packed record size = 14
不过,对于现在的操作系统来,packed Record 节省的那些空间已不用考虑他了。除了做DLL(不用packed容易造成内存混乱)和做硬件
编程时(比如串口)编程时必须用到packed Record,其它情况都可以用Record
呵呵。 PIPI给我上了一课。 多谢。我犯了形而上学想当然的错误
专门试了一下
procedure TForm1.Button1Click(Sender: TObject);
var a: packed array[1..10] of Integer;
b: array[1..10] of Integer;
begin
a[1] := 1;
a[2] := 256;
a[3] := 65535;
a[4] := 65535;
a[5] := 100000;
Edit1.Text := IntToStr(Sizeof(a));
b[1] := 1;
b[2] := 256;
b[3] := 65535;
b[4] := 65535;
b[5] := 100000;
Edit2.Text := IntToStr(Sizeof(b));
end;
两者是同样的内存尺寸
有 Packed 的占用内存小,但是速度慢一点
没 Packed 的占用内存大,但是速度快一点
比如说,有一个结构t,你又使用了一个a很大的array of t,那么可能要节省一点内存
但是,如果你不是申请很多t的实例,那么不用节省几个byte,要知道现在内存很大了
1M那可是 100多万 byte啊
另外,说一下为什么align了就快:
比如一个integer 4个字节,如果他的气死地址是4的倍数,0、4、8、12……
那么一次时钟(还是总线?)周期就可以读写它,
如果起始于1、2、3,那么要分2个周期才能读写它
用了packed后数据会压缩,但速度变慢。这就是两者的区别!
比如
packed record
aaa:byte
bbb:inetegr
ccc:byte
end //只占用6字节
而
record
aaa:byte
bbb:inetegr
ccc:byte
end //占用12个字节
delphi缺省使用 没有packed 的
Packed 还有一个要考虑的地方就是,如果你要做DLL的话,那么参数的传递就要用Packed的,否则很容易造成内存的写乱.
一般為了效率考量, structure, array.. 之類的資料, complier 會把記億體做所謂 alignment (對齊?) 的調整, 這樣存取時會比較快速
舉個例子, 沒有特別調整 complier 的 alignment 時:
type
TTest = record
x: integer; // 4 bytes
y: char; // 1 byte, 但實際上會是占 4 bytes
end;
你可以做一個簡單的測試, sizeof(TTest) 會等於 8
但如果加上 packed 時, 則 complier 不做 alignment,
這時就會是你真正定義的長度了:
type
TTest = packed record
x: integer; // 4 bytes
y: char; // 1 byte, 實際上也會是占 1 byte
end;
跑出來的結果, sizeof(TTest) 會等於 5
一般是不需 packed, 但如果需要這樣的應用 (如與dll接軌, 硬體控制),
就可能需要拿出來使用..
PS: packed 相當於 {$A1}
s07452你好:
宣告記錄型態(record),預設的編譯方式會將各欄佔用的記憶體長度以方便CPU存取的方式向word或double-word佔用空間大小對齊,以得到較佳的存取速度。如果宣告時使用packed record,則按照實際各欄佔用空間配置,但存取速度較差。你可以參考HELP裡關於packed的說明。
转载于:https://www.cnblogs.com/jieke/archive/2013/01/11/2855793.html
packed record与record区别相关推荐
- record java_Java Record类代码示例
import org.zephyr.data.Record; //导入依赖的package包/类 /** * This method takes in a List of orderedPairing ...
- oracle创建record,oracle record | 学步园
一.oracle record结构类型,定义方式如下: 1,自定义 type type_name is record(var1 datatype,var2 datatype2...); 例子: dec ...
- JDK14的新特性:Lombok的终结者record
文章目录 简介 新的Record类型 探讨Record的秘密 record扩展 总结 JDK 14的新特性:Lombok的终结者record 简介 自从面向对象产生之后,程序界就开始了新的变化,先是C ...
- C# 9.0新特性详解系列之五:记录(record)和with表达式
1 背景与动机 传统面向对象编程的核心思想是一个对象有着唯一标识,表现为对象引用,封装着随时可变的属性状态,如果你改变了一个属性的状态,这个对象还是原来那个对象,就是对象引用没有因为状态的改变而改变, ...
- JDK8-JDK17中的新特性(var类型推断、模式匹配、Record、密封类)
文章目录 1. 新语法结构 1.1 Java的REPL工具: jShell命令 1.2 异常处理之try-catch资源关闭 1.3 局部变量类型推断 1.4 instanceof的模式匹配 1.5 ...
- nutz 结合QueryResult,Record 自定义分页查询,不构建pojo 整合
public QueryResult getHistoryIncome(int d, int curPage) throws Exception { /**sql**/ Sql sql = Sqls. ...
- SAP QM 不常用功能点之 Physical-Sample Record
SAP QM 不常用功能点之 Physical-Sample Record A record that contains all master data and transaction data fo ...
- 快速搭建Java 17环境并玩转Record特性
Java 17现在已经发布,不少同学蠢蠢欲试,但是又担心配置新的JDK会影响现在的项目环境.今天介绍一个项目级别的JDK配置方法.让你先人一步快速入门Java 17,同时也不会影响原有项目. 项目快速 ...
- ext store 数据修改_Ext 修改Store初始化加载完后修改record属性。
/** * Created by huangbaidong on 2016/9/18. * 产品组件通用Store,*/Ext.define('app.component.ebs.itemdata.P ...
最新文章
- XamarinSQLite教程下载安装SQLite/SQL Server Compact Toolbox
- CRM订单上状态字段在UI的显示逻辑
- requests源码分析
- ebs 供应商地点信息_EBS标准的查看供应商地址
- (41)System Verilog输出变量时序延迟
- Introduction to Mathematical Thinking - Week 4
- leetcode978. Longest Turbulent Subarray
- boolean类型默认值_【Java基础】还在问String属于什么数据类型
- 杨辉三角数学性质及参考例题
- JAVA通过BufferedImage进行图片的绘制,缩放,裁剪,水印等操作
- Word控件Spire.Doc 转换教程(三):如何将 Word 转换为 PDF
- VirtualBox的vmdk文件压缩
- java activity_java中的Activity
- 【读过的书】《好看的皮囊千篇一律,有趣的灵魂万里挑一》
- 进口十大旋转编码器厂商
- C语言编程--根据麦克劳林公式计算任意角的正弦余弦
- LSV软件不定时无法下载谷歌影像的原因
- 云编译DSM引导(学习记录)
- 软件下载传送门(个人习惯自用记录)
- 计算机网络-常用英文简写与名词解释
热门文章
- 用shell脚本监控进程是否存在 不存在则启动的实例
- note-删除Visual Studio recent Projects list
- Linux 内核中的 GCC 特性(zz)
- Javascript编程基础1
- (转)关于Linux核心转储文件 core dump
- 【转】Linux查看物理CPU个数、核数、逻辑CPU个数
- 地理空间数据库(Geodatabase)结构(翻译)
- python django 动态网页_使用Django创建动态页面
- PowerShell-5.网络请求
- hdu2413 二分+二分匹配