这 2 个字符串分配等效吗?

问题描述 投票:0回答:1

我看到这个人,他写了这段代码:

func foo1() *string {
    var pointa *string
    pointa = new(string)
    *pointa = "stuff"
    return pointa
}

非常好,非常好,但是,忍不住注意到还可以写:

func foo2() *string {
    var pointa *string
    var str = "stuff"
    pointa = &str
    return pointa
}

第一个代码说:

  • 动态分配一个底层存储为空的字符串容器
  • 使用该文字的内容覆盖底层存储
  • 我假设,由于COW,底层存储只是指向ELF数据段中的文字数据

第二个代码说:

  • 在本地分配字符串的实例
  • 但是因为稍后它会通过引用逃脱作用域
    &
    ,所以它将被动态分配
  • 但是,由于 COW,不会发生任何复制

我的这些假设正确吗? 这两个动态字符串分配等效吗?

new(string); *pointer = "payload"
是否正是第二个代码中发生的事情,但在幕后,隐式发生?

这些代码片段会产生与分配和初始化字符串相同的代码吗?

string go dynamic-memory-allocation
1个回答
5
投票

它们相同但冗长。第一个分配一个字符串指针(其中包含指向实际字符串内容及其长度的指针),然后初始化该指针以指向字符串。第二个创建一个本地指针,但由于该指针转义了该函数,因此编译器将其分配在堆上。这可以通过以下方式简化:

func foo2() *string {
    var str = "stuff"
    return &str
}
© www.soinside.com 2019 - 2024. All rights reserved.