Go 中,編譯器透過內聯函數來最佳化程式碼執行,即複製被呼叫函數的程式碼並直接插入進入呼叫者的程式碼。雖然這可以提高效能,但也可能導致需要明確阻止函數呼叫內聯的情況。
內嵌編譯指示:
Go 提供了//go:noinline pragma,它會停用特定函數的內聯。將此指令放置在函數宣告之前,以防止其內聯執行。
//go:noinline func isPrime(p int) bool { // ... }
編譯器標誌:
或者,您可以使用 -gcflags 停用所有內嵌最佳化=-l 編譯器標誌。
go build -gcflags=-l primes.go
GCC 中的 -O0 選項停用所有程式碼最佳化,包括內聯。然而,Go 的內聯最佳化更加細粒度,允許明確控制哪些函數應該內聯或不內聯。
考慮以下程式碼片段primes 範例:
if isPrime(p) { fmt.Println(p) } func isPrime(p int) bool { for i := 2; i < p; i += 1 { for j := 2; j < p; j += 1 { if i * j == p { return false } } } return true }
預設情況下,isPrime 函數將內聯到if 語句中,可能會減慢速度由於雙循環而關閉程式。將 //go:noinline 指令新增至 isPrime 函數可確保直接呼叫它,從而提高效能。
以上是如何在Go中明確控制函數內聯?的詳細內容。更多資訊請關注PHP中文網其他相關文章!