DELPHI中不同型別的動態陣列變數共享記憶體

2021-08-07 06:47:07 字數 1447 閱讀 3399



你手上現在只有乙個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共享一塊記憶體。 也就是說只有的型別轉換沒有涉及到記憶體的新的分配。

functionnewtypefunction(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);

vara: 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;

特別獻給老程式設計師,過去d7都是用pansichar的幹活,現在d庫很多函式需要tbytes的幹活。。**公升級。。吃一壺

經常碰到這樣的場景。

iOS中TableView的不同型別

tableview是ios開發中經常用到的view,針對不同的顯示需求,我們需要不同的cell來進行顯示,比較複雜的顯示我們一般會自定義cell的樣式,但是簡單的顯示就可以靠ios本身支援的列表型別了。ios目前支援四中列表型別,分別是 uitableviewcellstyledefault 預設型...

不同型別的檔案

cpp檔案 cpp是用c 語言編寫的源 檔案的字尾 具體實現 h檔案 h是c語言和c 語言的標頭檔案 函式宣告,巨集定義,函式原型 pde檔案 一共有4種可能,分別為 1 powerdesk encrypted file 2 pathology data exchange file 3 afp pa...

js中不同型別作比較

示例 doctype html html head meta charset utf 8 meta name viewport content width device width,initial scale 1 title title head body body script 0 和 和 和 f...