gcc利用暫存器儲存引數提高效能

2021-06-28 22:39:59 字數 903 閱讀 4252

"在x86-64時代,暫存器數量多了,gcc就可以利用多達6個暫存器來儲存引數,多於6個的引數,依然還是通過入棧實現。了解這些對我們寫**很有幫助,起碼有兩點啟示:

盡量使用6個以下的引數列表,不要讓gcc為難啊。

傳遞大物件,盡量使用指標或者引用,鑑於暫存器只有64位,而且只能儲存整形數值,暫存器存不下大物件 "

參考**:

long setbbb(int a, int b, int c, int d, int e, int f, int g, int h)

對應的彙編為:

mov    %edi,-0x4(%rbp)

mov    %esi,-0x8(%rbp)

mov    %edx,-0xc(%rbp)

mov    %ecx,-0x10(%rbp)

mov    %r8d,-0x14(%rbp)

mov    %r9d,-0x18(%rbp)

movl   $0x1,-0x4(%rbp)

movl   $0x2,-0x8(%rbp)

movl   $0x3,-0xc(%rbp)

movl   $0x4,-0x10(%rbp)

movl   $0x5,-0x14(%rbp)

movl   $0x6,-0x18(%rbp)

movl   $0x7,0x10(%rbp)

movl   $0x8,0x18(%rbp)

頭6行對應取六個引數, 跟參考**中那6個暫存器是一致的

接著6行就是賦值, 最後兩行也是賦值, 賦到棧的引數區

也就是說, 前6個引數是用暫存器傳遞的, 後兩個引數是用棧傳遞的

感謝茅草屋的強力輸出,參考**: 

x86-64暫存器和棧幀

暫存器 記憶體 儲存器

暫存器 又稱快取 一般是指由基本的rs 觸發器結構衍生出來的 d觸發,就是一些與非門構成的結構,一般整合在 cpu內,其讀寫速度跟 cpu的執行速度基本匹配,但因為效能優越,所以造價昂貴,一般好的 cpu也就只有幾mb的 2級快取,1級快取更小。使用暫存器可以縮短至零長度 節省儲存空間,提高指令的執...

arm 暫存器 函式 引數

1.暫存器使用說明 arm處理器中r0 r15共16個暫存器,它們的用途是一些約定的習慣!並依據這些用途定義了別名。如圖 暫存器的使用情況如下 1 子程式間通過暫存器r0 r3來傳遞引數,這時可以使用它們的別名a0 a3,被呼叫的子程式返回前無須重複r0 r3的內容。2 在子程式中,使用r4 r11...

儲存 暫存器和記憶體

計算機儲存塔狀結構,暫存器最快,記憶體其次,最慢的是硬碟 同樣是電晶體儲存裝置,為什麼暫存器比記憶體快?一 距離不同 距離不是主要因素,但是最好理解,記憶體離cpu比較遠,所以要耗費更長時間讀取。以3ghz的cpu為例,電流每秒鐘 可以振盪30億次,每次耗時大約為0.33納秒。光在1納秒的時間內,可...