例如,我有一个函数,它应该返回一个指向结构的指针。两个例子:
第一:
type ExampleGrpcMessage struct {
SomeValue string
}
func GrpcHandler() *ExampleGrpcMessage {
// ... some code
test:= FuncTwo()
// ... some code
return test
}
//go:noinline
func FuncTwo() *ExampleGrpcMessage {
return &ExampleGrpcMessage{
SomeValue: "SomeData",
}
}
字符串
第二:
type ExampleGrpcMessage struct {
SomeValue string
}
func GrpcHandler() *ExampleGrpcMessage {
// ... some code
test := FuncTwo()
// ... some code
return &ExampleGrpcMessage{
SomeValue: test.SomeValue,
}
}
type MessageOnStack struct {
SomeValue string
}
//go:noinline
func FuncTwo() MessageOnStack {
return MessageOnStack{
SomeValue: "SomeData",
}
}
型
在第一个例子中,结构在FuncTwo
中转义到堆。在第二个例子中,在GrpcHandler
中。这些例子之间在性能上有什么区别吗?
1条答案
按热度按时间zzoitvuj1#
在第一个例子中,你返回了一个指向堆中分配的结构的指针,这允许在代码的其他部分访问该结构,并确保即使在函数完成后数据仍然可用。如果结构需要在程序的不同部分共享或需要持久化一段时间,这特别有用。
在第二个例子中,你返回了一个在堆栈上分配的结构,这意味着该结构是临时的,并且仅限于创建它的函数的上下文。这可以简化内存管理并提高性能,但数据将无法在函数之外使用。