為什麼用指標比較快?

時間 2021-05-14 11:38:31

1樓:三三白白

預設情況下a的儲存型別是auto的也就是說編譯器心情好(劃掉)視情況會將a儲存在暫存器中。這樣來講直接訪問a是不需要從記憶體位址中讀取的,必然是不比通過指標訪問慢的。但是在restrict指標或其他簡單的環境下*p使用可能被存入暫存器的,也就有可能比正常訪問a要快速。

2樓:讓川神先表演

僅以題目中描述為準寫乙個例子

呼叫printf函式原因是,這個函式傳入的引數為值

呼叫_add函式原因是,這個函式傳入的引數為指標

用這個例子來看一下使用時,兩種引數和這兩個變數,那個時間開銷大一些

void

_add

(int*a

)int

main

()編譯完了看彙編加了注釋

先說一下注釋裡有點繞的那個

00CFFA44是a的位址,該位址裡存的值是3

00CFFA38是p的位址,該位址存的是00CFFA44,也就是a的位址

所以int *p = &a賦值時,要先取到a的位址00CFFA44,然後把a的位址00CFFA44放在p的位址00CFFA38中。

同樣,使用的時候也要先從p的位址裡拿到a的位址,然後再從a的位址裡拿到3,而直接使用a傳參也就是直接從a的位址裡拿到3就OK了

從步驟上來看,使用a更快些。

從位元組碼來看,用p傳參過程從0041386B到***共6個位元組,用a傳參的過程是從***到00413874共4個位元組,所以也是a更快。雖然兩個位元組的差異就像沒差異一樣。

然後是_add函式的指標傳參

第乙個_add是p傳參,mov eax, [ebp+p],從p位址中拿到a的值然後壓棧

第二個_add是&a傳參,lea eax, [ebp+a],取a的位址,然後壓棧

兩者位元組碼相同,無差異。

題目中沒說具體使用情況,單獨下結論指標快應該不對。

指標快而且有顯著時間差異的情況,我覺得應該是c++類物件傳參時,值傳遞會出發拷貝建構函式,而指標或引用傳參時不會觸發拷貝建構函式。

3樓:xjfql

用指標比較快,這句話應該是有上下文的,看和什麼比了。

你描述的情況,肯定是直接訪問a快,用指標p需要跳轉一次,就比較慢了,你的理解沒問題的。

指標究竟有什麼用?

劉添億 指標的乙個典型應用是資料拆分 拼接,尤其是諸如微控制器之類的底層。比如,flash一次只能儲存乙個word,而我們要儲存乙個大結構體,可以考慮用指標拆分。又如,RS232每次只能傳輸乙個位元組,而我們要傳輸乙個double,也不妨用指標拼接 拆分。諸如crs檢驗,也可以用指標拆分複雜資料。指...

為什麼後剎車片磨損比較快?

三步 通常前後摩擦片的廠家是不一樣的,用的摩擦材料也不一樣。不同材料的磨損效能也有差異,所以可能你的車後剎車片比前剎車更不耐磨。 這個其實是要分情況的。第一種情況,就像老司機所說,大多數車輛都會採取前置引擎的布局模式,車輛的重心都是在車頭部分,剎車時,車輛重心前移,基本壓在前軸上 點頭 前制動系統需...

吃什麼食物胖得比較快?

食品夥伴網 飲食方面 少吃多餐,但不要增加每餐的飯量。因為身材消瘦的人大多腸胃功能較弱,一餐吃得太多往往不能有效吸收,反而會增加腸胃負擔,引起消化不良。可以把每天的進餐次數改為4 5餐。食物以易消化 高蛋白 高熱量為原則,用循序漸進的方式逐步提高各種營養物質的攝入,如雞肉 魚片 綠色蔬菜 海參 黃油...