關(guān)于返回結(jié)構(gòu)體的函數(shù)

關(guān)于返回結(jié)構(gòu)體的函數(shù)

ID:20841415

大小:55.72 KB

頁數(shù):4頁

時間:2018-10-17

關(guān)于返回結(jié)構(gòu)體的函數(shù)_第1頁
關(guān)于返回結(jié)構(gòu)體的函數(shù)_第2頁
關(guān)于返回結(jié)構(gòu)體的函數(shù)_第3頁
關(guān)于返回結(jié)構(gòu)體的函數(shù)_第4頁
資源描述:

《關(guān)于返回結(jié)構(gòu)體的函數(shù)》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。

1、(一)不超過8bytes的小結(jié)構(gòu)體可以通過EDX:EAX返回。本文的范例代碼取材于《匯編中函數(shù)返回結(jié)構(gòu)體的方法》一文,并在此基礎(chǔ)上進行修改和試驗。要研究的第一份代碼如下,定義一個不超過8bytes的小結(jié)構(gòu)體,不超過8bytes是因為這個結(jié)構(gòu)體能夠用EDXzEAX容納,我們之后將看到在release編譯時,編譯器能夠向返回普通基礎(chǔ)類型那樣進行返回。ttinclude//不超過8bytes的“小結(jié)構(gòu)體”structA{inta;intb;};//返回結(jié)構(gòu)體的函數(shù)structAadd(intx,inty){structAt;t

2、.a=x氺y;returnt;}intmain(){structAt=add(3,4);printf(/zt.a=%ldrT,t.a);return0;首先,我們需要解決一個常見困惑,就是耍明確這段代碼和下面的典型錯誤代碼的區(qū)別:char*get_buffer()charbuf[8];returnbut;上面的get_buffer返回的是棧上的臨時變量空間,在函數(shù)返回后,其所在的空間也就被“回收/釋放”了,也就是說函數(shù)返回的地址位丁棧的增長方向上,是不穩(wěn)定和不被保證的。那么返回結(jié)構(gòu)體的函數(shù)則不同,你可以發(fā)現(xiàn)返回結(jié)構(gòu)體的函數(shù)是工作正常有效

3、的。在add函數(shù)中有一個臨時性結(jié)構(gòu)體t,毫無疑問,t將在add函數(shù)返回時被釋放,似由于t被當做“值”進行返回,閔此編譯器將保證add的返回值對于add的調(diào)用者(caller)來說是有效的。另外需要明確的一點是,我個人覺得,現(xiàn)實里這種返回結(jié)構(gòu)體的方式比較少見,后面將會看到這樣做會產(chǎn)生臨時對象和多余拷貝過程,效率不高。常見方法是傳遞結(jié)構(gòu)體指針。但作為語言上允許的方式,有必要弄清楚編譯器如何實現(xiàn)這種方式,而耍弄清楚這個問題,需耍查看匯編代碼。使用VC6輸入上述代碼,下面分別給出其匯編代碼。(1)debug版本,匯編代碼如下。Esmall_str

4、uct_debug下面是實現(xiàn)方式的棧示意閣:低地址add函數(shù):tebpebp保存值返回地址棧增長方向臨時對象main函數(shù):ebpebp保存值髙地址總結(jié):(1.1)用edxzeax傳遞返回值。調(diào)用方不需要在棧上向add函數(shù)傳遞接受返回值的地址。(2.2)debug版本在調(diào)用方生成臨時對象返回值,然后再把臨時對象拷災(zāi)到main臨時變量所在地址。效率低。(2)release版本,匯編代碼如下:Esmall_struct_release總結(jié):(2.1)同(1.1),用edxzeax傳遞返回值,不需要傳遞接收返回值的地址。(2.2)release版

5、本調(diào)用方?jīng)]有臨時對象,效率基本等同于傳結(jié)構(gòu)體指針。(2.3)release版本優(yōu)化的太厲害,甚至都沒有把返回值完整的拷貝到臨時變量t(只拷貝了結(jié)構(gòu)體中的成員t.b,t.a的拷貝被認為沒有存在價值而被優(yōu)化掉了,因為t.a的值存于eax),和高級語言有較大差別。

當前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動畫的文件,查看預(yù)覽時可能會顯示錯亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負責(zé)整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時聯(lián)系客服。
3. 下載前請仔細閱讀文檔內(nèi)容,確認文檔內(nèi)容符合您的需求后進行下載,若出現(xiàn)內(nèi)容與標題不符可向本站投訴處理。
4. 下載文檔時可能由于網(wǎng)絡(luò)波動等原因無法下載或下載錯誤,付費完成后未能成功下載的用戶請聯(lián)系客服處理。