Delphi 必須的一致的原因

2021-09-06 03:40:55 字數 1946 閱讀 5716

首先我們來物件a的記憶體空間:

從旁邊的字元,我們可以看到這個是tderive的定義.

現在看$00401c94是什麼,中間那4個0我們先不管.

跳過來是3個位址.現在我們在**編輯器裡面看看這3個位址都是什麼**吧.

這3個位址原來是tderive中實現iinte***ce的方法的位址.因為tderive是從tbase繼承下來,而tbase是從tinte***cedobject繼承下來,整個繼承過程中沒有對iinte***ce的3個三個方法進行任何修改,所以我們這裡看見上面中也是直接跳到tinte***cedobject中去.

接下來看看$004bd2d0位址上的內容.

這裡有四個位址可疑,我們同樣在**編輯器裡面檢視:

看見沒有 這是個位址是ibase介面對應的四個方法.你可能要問 我們ibase介面不是只有個talkbase方法麼?但是你不要忘了ibase是預設繼承iinte***ce的.所以3+1=4啦.

接下來的$00000037 = 55;這個就是ftest的記憶體區域,乙個整型.

下面再看看$004bd3ec的內容:

現在有5個位址可疑,聰明的朋友肯定已經猜到了這個就是iderive介面實現方法的指標列表.1+1+3=5嘛.不過我們還是來看看:

ok,我們猜測正確了.好的,我們現在就可以劃分了.

我們可以看到整個資料排列的過程就和繼承的過程的一樣的.顯示類名->繼承來自tinte***cedobject中的資料字段(這裡只有frefcount: integer)->實現iinte***ce介面的方法->繼承來自tbase中的資料字段(沒有定義任何字段)->實現ibase介面的方法->tderive定義的資料字段->實現iderive介面的方法->$00 00 00 00結尾.

有了上面的結論我們就可以知道,編譯器去a.ftest的資料的過程,首先取a的指向位址,也就是物件a的實際記憶體的起始位置,然後偏移16個位元組的位置來取乙個pinteger^當成ftest的值.

那麼接下來我們要看看add進去的位址究竟是多少.

也就是上圖中我用紅色箭頭畫的ibase處,當我們使用錯誤的時候

2:   showmessage(inttostr(a.ftest));
就會出現在$ad2a2c的位址上偏移16個位元組,我們看看記憶體上這個位置是多少?

是$ad2680 = 11347584.我們看看 是不是這麼多.

而正確的方法

1: a:= tderive(ibase(flist[0]));
tderive(ibase 這裡會計算出ibase和tderive起始的偏移 = -12個位元組.

編碼原則 一致的思維(深度的一致)

結構 1 2 返回預設的表單 items 3 4 return 5 6 getdefaultformitems function property.editorconfig editorconfig 1617 if property.editorconfigfns 21 2223 return ed...

MYSQL主從不一致的原因

2011 05 06 15 50 36 分類 mysql 標籤 mysql 主從不一致 字型大小大中小訂閱 轉至 基本上用了mysql作為oltp業務的,基本上都會配置mysql的主從,一方面用mysql的主從做資料庫的讀寫分離,另一方面mysql本身的單機備份不是很強,一般採用主從架構,在從上進行...

ls h du sh的大小顯示不一致原因

近期在學習中偶然發現 ls h du sh的大小顯示不一致具體如下 root localhost ll h 總用量 20k rw r r 1 root root 3.8k 1月 7 08 17 1.txt rw 1 root root 1.4k 4月 27 2020 anaconda ks.cfg ...