簡體   English   中英

為什么Win32 API syscall中使用的緩沖區強制轉換為[1 &lt;&lt; 20] <type> 陣列?

[英]Why is a buffer used in Win32 API syscall cast to [1<<20]<type> array?

我正在編寫一個golang應用程序,該應用程序使用windows / svc軟件包與Windows Services進行交互。

當我查看程序包源代碼時,如何完成syscall時,我看到了有趣的強制轉換構造:

name := syscall.UTF16ToString((*[1 << 20]uint16)(unsafe.Pointer(s.ServiceName))[:]

摘自mgr.go

當處理Win32 API時需要傳遞一個預分配的緩沖區以從Win32 API函數(通常是數組或結構)接收值時,這是一種常見的模式。

我知道Win API返回一個由其指針表示的unicode字符串,並將其傳遞給syscall.UTF16ToString(s []uint16)函數,以在這種情況下將其轉換為go字符串。

當不安全的指針強制轉換為指向1M數組*[1<<20]uint16的指針時,我感到困惑。

為什么尺寸為1M [1 << 20]?

一個值的緩沖區是動態分配的,而不是固定大小為1M。

您需要為數組類型選擇靜態大小,因此將1<<20選擇為足夠大以允許調用返回的任何合理緩沖區。

這個大小沒有什么特別的,有時您會看到1<<31-1因為它是32位平台上最大的陣列,或者1<<30因為它看起來更好。 只要類型可以包含返回的數據,實際上就沒有關系。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM