Go语言 哪里更适合将结构体转义为堆

oewdyzsn  于 2023-11-14  发布在  Go
关注(0)|答案(1)|浏览(116)

例如,我有一个函数,它应该返回一个指向结构的指针。两个例子:
第一:

  1. type ExampleGrpcMessage struct {
  2. SomeValue string
  3. }
  4. func GrpcHandler() *ExampleGrpcMessage {
  5. // ... some code
  6. test:= FuncTwo()
  7. // ... some code
  8. return test
  9. }
  10. //go:noinline
  11. func FuncTwo() *ExampleGrpcMessage {
  12. return &ExampleGrpcMessage{
  13. SomeValue: "SomeData",
  14. }
  15. }

字符串
第二:

  1. type ExampleGrpcMessage struct {
  2. SomeValue string
  3. }
  4. func GrpcHandler() *ExampleGrpcMessage {
  5. // ... some code
  6. test := FuncTwo()
  7. // ... some code
  8. return &ExampleGrpcMessage{
  9. SomeValue: test.SomeValue,
  10. }
  11. }
  12. type MessageOnStack struct {
  13. SomeValue string
  14. }
  15. //go:noinline
  16. func FuncTwo() MessageOnStack {
  17. return MessageOnStack{
  18. SomeValue: "SomeData",
  19. }
  20. }


在第一个例子中,结构在FuncTwo中转义到堆。在第二个例子中,在GrpcHandler中。这些例子之间在性能上有什么区别吗?

zzoitvuj

zzoitvuj1#

在第一个例子中,你返回了一个指向堆中分配的结构的指针,这允许在代码的其他部分访问该结构,并确保即使在函数完成后数据仍然可用。如果结构需要在程序的不同部分共享或需要持久化一段时间,这特别有用。
在第二个例子中,你返回了一个在堆栈上分配的结构,这意味着该结构是临时的,并且仅限于创建它的函数的上下文。这可以简化内存管理并提高性能,但数据将无法在函数之外使用。

相关问题