線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1277
推到 Plurk!
推到 Facebook!

請問一個記憶體的問題

答題得分者是:sos_admin
hkstm
一般會員


發表:23
回覆:31
積分:10
註冊:2002-03-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-07-28 16:27:20 IP:218.165.xxx.xxx 未訂閱
…知道的請教導一下…謝謝 請問delphi的記憶體一個位址的容量都是固定的嗎…如果不是要怎麼計算? 每個型態所佔的位元又不一樣…大部份應該都只佔一個位址吧除了pcchar這些 而字串型態所佔的又不固定?(依靠型態來決定每個位址的容量?) 一個位址佔多大的空間是由cpu?還是系統決定? 因為以前的概念是幾條位址匯流排幾條資料匯流排? 再請問程式進行中時按下program pause時 出現的數字…下方左邊應該是記憶體位置吧下方右邊應該是內容 8*4是32位元的架構 右邊剛好也是32 下一個跳8個位元?這表示位址跟資料是1個位址是記憶8bit的資料? 我看二進位資料登錄檔也是一樣的用法…請問他的架構…? 感恩…
sos_admin
版主


發表:121
回覆:697
積分:768
註冊:2003-07-23

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-07-28 17:15:20 IP:61.155.xxx.xxx 未訂閱
你可以使用sizeof来得出变体所需的地址位 如: var i:integer; s:string; begin showmessage(inttostr(sizeof(integer)));//使用类型(1) showmessage(inttostr(sizeof(i)));//使用变体也可以(2) showmessage(inttostr(sizeof(string))); end; (1)与(2)是等价的!!!!
hkstm
一般會員


發表:23
回覆:31
積分:10
註冊:2002-03-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-07-28 19:03:42 IP:218.165.xxx.xxx 未訂閱
謝謝不過我想要的不是這個… 我比較想要了解的是其他的部份 不過還是謝謝你的回答
sos_admin
版主


發表:121
回覆:697
積分:768
註冊:2003-07-23

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-07-29 08:03:18 IP:61.155.xxx.xxx 未訂閱
hkstm 兄: 是否可以将您上面的叙述,简单明了些post!!! 或许,我误解您的意识!!!
hkstm
一般會員


發表:23
回覆:31
積分:10
註冊:2002-03-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-07-29 11:09:07 IP:218.165.xxx.xxx 未訂閱
簡單的說…就是delphi中記憶體位址跟其資料空間 是照什麼準則去分配。
sos_admin
版主


發表:121
回覆:697
積分:768
註冊:2003-07-23

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-07-30 07:28:16 IP:61.155.xxx.xxx 未訂閱
一般来说,编译器会尽可能将参数及局部变量放进寄存器中,顺序是EAX->EDX->ECX, 剩下的才压入堆栈:函数内声明的变量会放在EBP 的负偏移,参数会放在EBP 的正偏移。 但要注意很多例外的地方,比方说当函数定义为stdcall,cdecl,safecall时所有的参数都压栈,而且压栈顺序为从右向左。 这部分的内容可以参考Delphi所附帮助中 Object Pascal Refrence -> Program Control 例如: 定义变量的绝对地址: var CrtMode: Byte absolute $0040; 定义变量的别名: var Str: string[32]; StrLen: Byte absolute Str; 这都是用关键字Absolute事先的,具体可以参照一下帮助文件。 系统应该有张“变量名 --> 地址”的对应表,可那个表仅存在于编译过程之中,在目标代码中,绝大多数变量都变成了毫无意义的偏移量。 如果您真的需要这些或许可以用Delphi的RTTI里面是拥有这些信息的, 你可以通过RTTI来访问变量的信息. 这是我认为的一些资料,或许对您有帮助!!!
hkstm
一般會員


發表:23
回覆:31
積分:10
註冊:2002-03-15

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-07-31 14:33:03 IP:218.165.xxx.xxx 未訂閱
一般來說,編譯器會盡可能將參數及局部變數放進寄存器中,順序是EAX->EDX->ECX, 剩下的才壓入堆疊:函數內聲明的變數會放在EBP 的負偏移,參數會放在EBP 的正偏移。 但要注意很多例外的地方,比方說當函數定義爲stdcall,cdecl,safecall時所有的參數都壓棧,而且壓棧順序爲從右向左。 這部分的內容可以參考Delphi所附幫助中 Object Pascal Refrence -> Program Control 例如: 定義變數的絕對位址: var CrtMode: Byte absolute $0040; 定義變數的別名: var Str: string[32]; StrLen: Byte absolute Str; 這都是用關鍵字Absolute事先的,具體可以參照一下幫助文件。 -------------------------------------------------------------------- 請問壓棧?是什麼意思啊… 系統應該有張“變數名 --> 地址”的對應表,可那個表僅存在於編譯過程之中,在目標代碼中,絕大多數變數都變成了毫無意義的偏移量。 如果您真的需要這些或許可以用Delphi的RTTI裏面是擁有這些資訊的, 你可以通過RTTI來訪問變數的資訊. 這是我認爲的一些資料,或許對您有幫助!!!
sos_admin
版主


發表:121
回覆:697
積分:768
註冊:2003-07-23

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-07-31 15:58:26 IP:61.155.xxx.xxx 未訂閱
SORRY,写错了。应该是堆栈! 补充一下stdcall,cdecl,safecall的调用: 调用约定决定了参数被传递给例程的顺序,它们也影响从堆栈中删除参数、传递参数时寄存器的使用,以及错误和异常处理。默认的调用约定是register。 • register 和pascal 调用从左到右传递参数,也就是说,最左边的参数最早被计算并传递,最右边的参数最后被计算和传递;cdecl、stdcall 和safecall 调用从右到左传递参数; • 除了cdecl 调用,过程和函数在返回之前从堆栈中移除参数,而使用cdecl,当调用返回时,调用者从堆栈中移除参数; • register 调用能使用多达3 个CPU 寄存器传递参数,而其它调用则全部使用堆栈传递参数; • safecall 调用实现了异常“防火墙”,在Windows 下,它实现了进程间COM 错误通知。
hkstm
一般會員


發表:23
回覆:31
積分:10
註冊:2002-03-15

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-08-01 19:37:26 IP:218.165.xxx.xxx 未訂閱
_____________________________ | a1 | a2 | a3 | b1 | b2 | c1 | c2 | c3 | |___|___|___|___|___|___|___|___| 例上面有3個變數a,b,c 。a變數佔了三個位址一個位址也就是一個byte b佔了二個c佔了三個。 如果a1是從$000f開始的那就表示是連續的三個位址,a2就是$0010, 而a記憶體就是由頭一個a1算起也就是&000f,那b就是&0012,故假如a變數為integer型態表示那是連續的4個記憶體位置,也就是從000f到0012,不管其他的調用或是堆疊、或是記憶體的offset,我只是單純的想知道一個位址真的只是一個byte嗎,簡單的定址真的是像上面那樣子嗎?因為我從來不曉得這到底是不是真的。 sos_admin也謝謝你之前講的,堆棧?是堆疊的意思嗎? 發表人 - hkstm 於 2003/08/01 19:42:11
sos_admin
版主


發表:121
回覆:697
積分:768
註冊:2003-07-23

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-08-01 21:10:31 IP:218.2.xxx.xxx 未訂閱
可以这么讲,我想您如果学delphi可以不一定对变量的地址了解的这么清楚。 至于什么是堆栈呢? 你可以这样想:假设你有一张桌子。当你把一本书压入堆栈的时候,你实际上是把这本书放到了桌子上。如果你又把一本书放到了桌子上,那么你在桌子上就有两本书了。当你弹出一本书的时候,你从桌子上移走了最上面的一本书。这样你应该清楚什么是压入(push)和弹出(pop)了吧。我们可以将数值压入堆栈,也可以从堆栈中弹出数值。每次我们把一个数值压入堆栈,数值被存储到堆栈所指向的地方,堆栈变小。当弹出数值的时候,数值将本存储到指定的位置,堆栈变大。 所以,堆栈是一块保存数据的连续内存. 一个名为堆栈指针(SP)的寄存器指向堆栈的顶部.堆栈的底部在一个固定的地址. 堆栈的大小在运行时由内核动态地调整. CPU实现指令PUSH和POP, 向堆栈中添加元素和从中移去元素.
hkstm
一般會員


發表:23
回覆:31
積分:10
註冊:2002-03-15

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-08-01 21:54:28 IP:218.165.xxx.xxx 未訂閱
嗯…謝謝你的解釋…這是翻譯的不同… 堆棧在台灣的意思翻為堆疊… 內容跟你講的一樣…不過我倒是比較喜歡用管子作比喻 一個管子放三顆球滿第四顆要放進去一定要從上面先拿起來 也就是後進先出的意思LIFO,總之謝謝你的講解…。
sos_admin
版主


發表:121
回覆:697
積分:768
註冊:2003-07-23

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-08-02 06:17:35 IP:61.155.xxx.xxx 未訂閱
没想到计算机的术语在台湾与大陆之间也有差异哦! 大陆:堆棧 台灣:堆疊[堆叠]
hkstm
一般會員


發表:23
回覆:31
積分:10
註冊:2002-03-15

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-08-02 15:13:51 IP:219.81.xxx.xxx 未訂閱
那個倒是還好…我遇過最奇怪的是<缺省> 你們叫作?default...默認… 查了好久…。 對面的文章比較多可是翻的有些真的是看不懂… 不曉得有沒有這方面的翻譯工具…我說的是翻電腦專有名詞的。
sos_admin
版主


發表:121
回覆:697
積分:768
註冊:2003-07-23

發送簡訊給我
#14 引用回覆 回覆 發表時間:2003-08-02 15:48:05 IP:61.155.xxx.xxx 未訂閱
或许这就是所谓的文化差异吧!< > 没办法也!听多看多也就知道了,我也是和您一样;有时发贴子或回贴子,对于不太理解的台湾文化语句,只有猜了!< >
系統時間:2024-11-25 2:50:48
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!