《C專家程式設計》第六十頁引數在傳遞時為什麼會首先放到暫存器中?

時間 2021-05-05 18:15:38

1樓:北極

不定長引數,不是沒有引數,而是至少有乙個引數。

不定長的意思,不是真的不定長,而是通過第乙個引數來計算後面有幾個引數。

所以,第乙個引數肯定是固定的,所以只要確定了第乙個引數是用暫存器還是用棧,後面的只要按照呼叫約定來就可以了。

2樓:

按我理解要實現可變參

1.變參部分從右到左依次入棧

2.變參前有定參用來定位

3.呼叫者清理棧

所以一部分引數入暫存器是沒關係的

只要滿足上面那些條件就行了

也就是引數夠多

保證變參前那個定參能到堆疊

但是實際上可能不會這麼麻煩

有變參的需要時直接全傳到堆疊就行了

優先考慮暫存器不是必須

一切從需求出發吧

3樓:

原文的表述是「盡可能」,意思跟「首先」還是有區別的。

C編譯器使用暫存器傳遞引數是有條件的的,首先CPU的暫存器能裝得下引數的值(硬體位數限制),其次引數的個數不能超過CPU可以使用的暫存器個數。盡可能就是定義函式引數表的時候盡量往這兩個條件上靠。條件滿足不了,超出的部分,編譯器還是會用棧來傳遞引數的。

(當然,不同的編譯器,不同的硬體平台在處理這個問題上做法可能不盡相同)

直白的說,就是結構/陣列之類的復合型別作為引數傳遞的時候盡可能用指標,而不是傻不拉嘰的把整個結構體作為引數傳遞。後者不光是壓棧,速度慢(相當於把結構體copy了一遍),結構體size()比較大的時候還會把棧撐爆的,棧撐爆的時候程式就掛了。新手在這個問題上肯定是很容易掉進坑里的。

c 關於非同步程式設計?

你await的是乙個Task,Task是乙個future模式的實現,然後會交給當前的TaskScheduler排程,比如 TheadPool Youtube 上面有有乙個例子講的就是 Ivony 說的情況https youtu.be V2sMXJnDEjM using System using Sy...

準大一,自學程式設計,c還是c ?

無名 學C 吧,單純的C使用範圍沒有C 大,學好了C 你也能寫C,以後出去也好找工作。除了學習一門語言外,你也得考慮以後從事哪一行什麼樣的開發。把C 的語法掌握了,再有針對性的學習乙個方向。這樣到你大學畢業就好找對應的工作了,薪水也可以要的高一點。 3cpj 顯然開始按照學習的計畫,先 C 語言,作...

如何成為linux服務端C 開發專家

我們愛珂學 我的意見是,別去找那種很明顯搬磚的活。比如像我現在呆的這種遊戲公司,用的C 98,平時做的都是各種各樣的業務邏輯,就完全就是搬磚,最多成為乙個稍微好一點的搬磚工 比了比自己 就算是主程,通常都是來解決各種下面的人解決不了的陳年老bug。真正的技術積累還是得靠工作的,選乙個方向,然後找那個...