Dalam Go, pengkompil mengoptimumkan pelaksanaan kod dengan menyelaraskan fungsi, di mana kod fungsi yang dipanggil disalin dan dimasukkan terus ke dalam kod pemanggil. Walaupun ini meningkatkan prestasi, ia juga boleh membawa kepada situasi di mana panggilan fungsi perlu dihalang secara eksplisit daripada diselaraskan.
pragma Sebaris:
Go menawarkan //go:noinline pragma, yang melumpuhkan inlining untuk fungsi tertentu. Letakkan arahan ini sejurus sebelum pengisytiharan fungsi untuk menghalang pelaksanaan sebarisnya.
//go:noinline func isPrime(p int) bool { // ... }
Bendera pengkompil:
Sebagai alternatif, anda boleh melumpuhkan semua pengoptimuman sebaris menggunakan -gcflags =-l bendera pengkompil.
go build -gcflags=-l primes.go
Pilihan -O0 dalam GCC melumpuhkan semua pengoptimuman kod, termasuk sebaris. Walau bagaimanapun, pengoptimuman sebaris Go lebih terperinci, membenarkan kawalan eksplisit ke atas fungsi yang harus diselaraskan atau tidak.
Pertimbangkan coretan kod berikut daripada contoh nombor perdana:
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 }
Secara lalai, isPrime fungsi akan diselaraskan ke dalam pernyataan if, yang berpotensi memperlahankan atur cara disebabkan oleh gelung berganda. Menambah arahan //go:noinline pada fungsi isPrime memastikan ia dipanggil terus, meningkatkan prestasi.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengawal Fungsi Inlining Secara Eksplisit dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!