为了账号安全,请及时绑定邮箱和手机立即绑定

将字符串与指向字符串的指针作为参数传递给函数时,时间复杂度有什么区别?

将字符串与指向字符串的指针作为参数传递给函数时,时间复杂度有什么区别?

Go
GCT1015 2022-06-27 15:31:46
假设我有一个字符串 s。 s := "helloworld"现在,我的问题是,如果 s 有“n”个字节,那么如果我将 s 传递给一个函数,而不是将 &s 传递给一个函数然后访问字符串的第 i 个字节,那么相对于“n”的时间复杂度是多少。如果将 &s 传递给函数并访问字符串的第 i 个字节需要 O(1) 时间,那么当我将 s 传递给函数然后访问字符串的第 i 个字节时是否需要 O(n) 时间(因为整个字符串将被复制)?我试过了,发现复制一个字符串确实会改变指向它的指针。希望能更清楚地说明这一点。func main() {    str := "helloworld"    fmt.Println("string pointer 1:", &str)    printStringPointer(str)}func printStringPointer(s string) {    fmt.Println("string pointer 2:", &s)}输出:string pointer 1: 0xc000010200string pointer 2: 0xc000010210
查看完整描述

1 回答

?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

Go 中的字符串类似于切片,它们只是一个包含指向底层数据的指针和长度的细描述符。


您可以在reflect.StringHeader类型中看到这一点:


type StringHeader struct {

    Data uintptr

    Len  int

}

将字符串传递给函数时,会复制标头,但不会复制底层数据。我们可以更改您的示例以打印 的值Data,表明它指向内存中的相同地址:操场链接:


func main() {

    str := "helloworld"

    fmt.Println("string pointer 1: ", &str)

    fmt.Println("string Data 1:    ", (*reflect.StringHeader)(unsafe.Pointer(&str)).Data)

    printStringPointer(str)

}


func printStringPointer(s string) {

    fmt.Println("string pointer 2: ", &s)

    fmt.Println("string Data 2:    ", (*reflect.StringHeader)(unsafe.Pointer(&s)).Data)

}

输出:


string pointer 1:  0xc000010200

string Data 1:     4970654

string pointer 2:  0xc000010210

string Data 2:     4970654

传递字符串是常量时间(复制头部),底层数据不被复制。


查看完整回答
反对 回复 2022-06-27
  • 1 回答
  • 0 关注
  • 85 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信