DELPHI中不同类型的动态数组变量共享内存
来源:互联网 发布:百度人工智能平台接入 编辑:程序博客网 时间:2024/06/06 01:01
DELPHI中不同类型的动态数组变量共享内存
场景: 假如我们要调用A函数 procedure A( aBytes:Tbytes).
你手上现在只有一个STRING, 或者其他数组类型,比如Array of char. array of integer..一般的过程就是,首先把你手上的数组类型转换成符合A调用的需要的类型TBYTES,,其实很多时候我们需要要这个TBYTES纯粹是为了得到一个A函数运行的结果,BYTES其实并没有什么用,只是一个中间数据。但是有没有想过,转换的过程其实需要内存开销的,内存要分配,数据要复制,最后销毁。能不能把不同类型的数组共享在一块内存上。比如STRING,既可以当TBYTES用,也可以当 比如ARRAY OF INTEGER. 答案是肯定的。
玩法基础分析:一个动态数组的三要素,内存首地址,长度,元素大小。
内存首地址:简单,内存地址是可以相互贴的(贴就是指针共同指向一个地方)。直接赋值就行。
var Abytes:Tbytes; aIntegers: array of integer;
贴: Abytes:=Pointer(aIntegers);
元素大小:简单, SIZEOF(BYTE),sizeof(ineteger);
剩下就是长度在哪里?
长度:
DELPHI的动态数组管理有头部。位置就在动态数组指针的前面。头部有什么。。每个版本都不一样。但是一样的是,动态数组的前4个字节就是动态数组的长度(包括字符串也是如此)。
这样就可以愉快的玩耍了。
下面列文给出了一个字符串S变成TBYTES S的例子,但是A和S共享一块内存。 也就是说只有的类型转换没有涉及到内存的新的分配。
function NewtypeFunction(const A: tbytes): string;
begin
System.SetLength(Result, System.Length(A) shr 1);
System.Move(A[0], result[1], Length(A));
end;
procedure TForm1.btn1Click(Sender: TObject);
var
A: TBytes;
S: string;
begin
// A 和S共享一个内存地址。达到类型转换。
S := ‘我的agbc’;
A := Pointer(@S[1]); // 直接指针贴上去 ,共同指向一块内存
PInteger(PByte(A) – 4)^ := Length(S) shl 1; //脱离D对TBYTES的管理,修正TBYTES的长度
ShowMessage(NewtypeFunction(A)); // TBYTES活了。 能用。
PInteger(PByte(A) – 4)^ := Length(A) shr 1; // 恢复 S字符串长度。
A := nil;// 插去屁股
end;
- DELPHI中不同类型的动态数组变量共享内存
- DELPHI中不同类型的动态数组变量共享内存
- Delphi动态申请数组内存的方法
- 不同类型变量的内存分配模型
- 将多个不同类型的控件放在一个动态数组(ArrayList)中作为参数(控件数组)传递
- 共享内存多次写入不同类型的数据测试代码
- Delphi 共享内存的应用
- Delphi 共享内存的应用
- 不同类型的变量相加
- 不同类型的变量在内存中存储的详细情况
- 不同类型的变量在内存中存储的详细情况
- delphi中为动态数组分配空间的问题
- Delphi中关于动态数组的引用操作
- Delphi 的动态数组1
- Delphi 4 的动态数组
- delphi 动态数组的使用
- java中不同类型的数据放到一个数组中
- 深入理解C系列:不同类型变量的变量名和内存间的关系
- c++日期类的实现(基础篇)
- springmvc的接参与传参
- 171122—数组程序练习(排序并输出下标&两个数组按顺序排成一个)
- 文档总结18-C语言中的函数
- Android入门基础:从这里开始
- DELPHI中不同类型的动态数组变量共享内存
- vim基础学习
- LeetCode 分类练习(2)—— 三向切分 partition 思想的应用
- ArcGISEngine二次开发(5):添加矢量要素
- Mysql主从同步(复制)
- 小波变换教程(十九)
- Android的滑动分析
- 图形学基础: 第5章 纹理贴图
- 选择排序