Golang Tips:傳遞各型別參數的空間代價

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

函數調用時,實參的值會複製到形參。

對於int32,uint64等形如intN,uintN的類型,傳遞的代價是顯而易見的,例如傳遞一個int32需要4個位元組。int和uint是平台相關,均為4位元組(32位)或8位元組(64位),uintptr與任何類型的指標都是4位元組(32位)或8位元組(64位)。float32和float64分別需要4位元組和8位元組,complex64和complex128分別相當於兩個float32和兩個float64。

字串(string)、切片(slice)、介面(interface)、字典(map)、channel不是那麼顯而易見,但通過讓Go產生C庫以便看出一些端倪。

Go產生C庫時會自動產生一個標頭檔(.h),部分內容如下:

typedef struct { char *p; GoInt n; } GoString;typedef void *GoMap;typedef void *GoChan;typedef struct { void *t; void *v; } GoInterface;typedef struct { void *data; GoInt len; GoInt cap; } GoSlice;

其中,GoInt在32位和64位下分別相當於(C語言的)int32_t和int64_t,GoUint類似。

由此可見,Go在傳遞字串的時候,傳遞的代價相當於一個指標和一個(Go的)int。當然,如果在函數體中修改了字串形參,Go會為這個字串產生一個(深)拷貝。

傳遞一個map或chan都相當於傳遞了一個指標,所以,傳遞它們的代價是很小的,效能很高的。

傳遞一個interface的代價是兩個指標(可能一個標識類型,一個標識方法集)。

傳遞一個slice的代價是一個指標加兩個(Go的)int。


數組和結構體:

Go的數組是純粹的實值型別,傳遞一個[N]T的代價是N個T。

傳遞一個結構體的代價是每個欄位大小的總和(暫不考慮對齊問題)。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.