3 回答

TA貢獻1827條經驗 獲得超8個贊
指針之所以有用,有幾個原因。指針允許控制內存布局(影響CPU緩存的效率)。在Go中,我們可以定義一個結構,其中所有成員都位于連續內存中:
type Point struct {
x, y int
}
type LineSegment struct {
source, destination Point
}
在這種情況下,Point結構將嵌入到LineSegment結構中。但是您不能總是直接嵌入數據。如果要支持二進制樹或鏈表之類的結構,則需要支持某種指針。
type TreeNode {
value int
left *TreeNode
right *TreeNode
}
Java,Python等不存在此問題,因為它不允許您嵌入復合類型,因此無需在語法上區分嵌入和指向。
使用Go指針解決的Swift / C#結構問題
實現此目標的一種可能替代方法是像C#和Swift一樣區分struct和class。但這確實有局限性。雖然通??梢灾付ê瘮祵⒔Y構體作為inout參數來避免復制該結構體,但是它不允許您存儲對結構體的引用(指針)。這意味著當您發現一個有用的結構(例如,創建池分配器)時,就永遠不能將其視為引用類型。
自定義內存分配器
使用指針,您還可以創建自己的池分配器(這非常簡化,刪除了許多檢查以僅顯示原理):
type TreeNode {
value int
left *TreeNode
right *TreeNode
nextFreeNode *TreeNode; // For memory allocation
}
var pool [1024]TreeNode
var firstFreeNode *TreeNode = &pool[0]
func poolAlloc() *TreeNode {
node := firstFreeNode
firstFreeNode = firstFreeNode.nextFreeNode
return node
}
func freeNode(node *TreeNode) {
node.nextFreeNode = firstFreeNode
firstFreeNode = node
}
交換兩個值
指針還允許您實現swap。那就是交換兩個變量的值:
func swap(a *int, b *int) {
temp := *a
*a = *b
*b = temp
}
結論
Java從未能夠完全取代C ++在諸如Google之類的地方進行系統編程,部分原因是由于缺乏控制內存布局和使用的能力而無法將性能調整到相同的程度(高速緩存未命中會嚴重影響性能)。Go旨在在許多領域取代C ++,因此需要支持指針。
- 3 回答
- 0 關注
- 467 瀏覽
添加回答
舉報