返回顶部
首页 > 资讯 > 精选 >这两个字符串分配等效吗?
  • 199
分享到

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

作用域 2024-02-05 22:02:54 199人浏览 泡泡鱼
摘要

问题内容 我看到这个人,他写了这段代码: func foo1() *string { var pointa *string pointa = new(string)

问题内容

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

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" 到底在第二个代码中发生了什么,但是在幕后,隐式地发生了什么?

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


正确答案


Go 规范不做任何保证,无论您今天发现什么答案,都可能会在没有警告的情况下发生更改,但您可以使用 godbolt.org 上提供的 GC 版本亲自查看您的函数的所有三个版本都生成相同的输出,仅字符串的名称和值不同(stuff1/stuff2/stuff3):

https://www.PHP.cn/link/8a3a60ca2371a13fd1e84043f75f2f31

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

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

func foo3() *string {
    x := "stuff3"
    return &x;
}

输出:

main_foo1_pc0:
        TEXT    main.foo1(SB), ABIInternal, $24-0
        CMPQ    SP, 16(R14)
        PCDATA  $0, $-2
        JLS     main_foo1_pc50
        PCDATA  $0, $-1
        PUSHQ   BP
        MOVQ    SP, BP
        SUBQ    $16, SP
        FUNCDATA        $0, gclocals·g2BeySu+wFnoycgXfElmcg==(SB)
        FUNCDATA        $1, gclocals·g2BeySu+wFnoycgXfElmcg==(SB)
        LEAQ    type:string(SB), AX
        PCDATA  $1, $0
        CALL    runtime.newobject(SB)
        MOVQ    $6, 8(AX)
        LEAQ    go:string."stuff1"(SB), CX
        MOVQ    CX, (AX)
        ADDQ    $16, SP
        POPQ    BP
        RET
main_foo1_pc50:
        NOP
        PCDATA  $1, $-1
        PCDATA  $0, $-2
        CALL    runtime.morestack_noctxt(SB)
        PCDATA  $0, $-1
        JMP     main_foo1_pc0
main_foo2_pc0:
        TEXT    main.foo2(SB), ABIInternal, $24-0
        CMPQ    SP, 16(R14)
        PCDATA  $0, $-2
        JLS     main_foo2_pc50
        PCDATA  $0, $-1
        PUSHQ   BP
        MOVQ    SP, BP
        SUBQ    $16, SP
        FUNCDATA        $0, gclocals·g2BeySu+wFnoycgXfElmcg==(SB)
        FUNCDATA        $1, gclocals·g2BeySu+wFnoycgXfElmcg==(SB)
        LEAQ    type:string(SB), AX
        PCDATA  $1, $0
        CALL    runtime.newobject(SB)
        MOVQ    $6, 8(AX)
        LEAQ    go:string."stuff2"(SB), CX
        MOVQ    CX, (AX)
        ADDQ    $16, SP
        POPQ    BP
        RET
main_foo2_pc50:
        NOP
        PCDATA  $1, $-1
        PCDATA  $0, $-2
        CALL    runtime.morestack_noctxt(SB)
        PCDATA  $0, $-1
        JMP     main_foo2_pc0
main_foo3_pc0:
        TEXT    main.foo3(SB), ABIInternal, $24-0
        CMPQ    SP, 16(R14)
        PCDATA  $0, $-2
        JLS     main_foo3_pc50
        PCDATA  $0, $-1
        PUSHQ   BP
        MOVQ    SP, BP
        SUBQ    $16, SP
        FUNCDATA        $0, gclocals·g2BeySu+wFnoycgXfElmcg==(SB)
        FUNCDATA        $1, gclocals·g2BeySu+wFnoycgXfElmcg==(SB)
        LEAQ    type:string(SB), AX
        PCDATA  $1, $0
        CALL    runtime.newobject(SB)
        MOVQ    $6, 8(AX)
        LEAQ    go:string."stuff3"(SB), CX
        MOVQ    CX, (AX)
        ADDQ    $16, SP
        POPQ    BP
        RET
main_foo3_pc50:
        NOP
        PCDATA  $1, $-1
        PCDATA  $0, $-2
        CALL    runtime.morestack_noctxt(SB)
        PCDATA  $0, $-1
        JMP     main_foo3_pc0

以上就是这两个字符串分配等效吗?的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: 这两个字符串分配等效吗?

本文链接: https://lsjlt.com/news/561093.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 这两个字符串分配等效吗?
    问题内容 我看到这个人,他写了这段代码: func foo1() *string { var pointa *string pointa = new(string) ...
    99+
    2024-02-05
    作用域
  • php如何判断两个字符串相等
    在php中使用strcmp()函数判断两个字符串是否相等,具体方法如下:strcmp()函数作用:php中strcmp()函数的作用是用于比较两个字符串。strcmp()函数语法:strcmp(string1,string2)参数:stri...
    99+
    2024-04-02
  • mysql如何判断两个字符串相等
    mysql中判断两个字符串是否相等的方法直接比较字符串如比较字符串p1与p2是否相等SELECT * FROM E p1,C p2 WHERE p1.FIRSTNAME=p2.FIRSTNAME;将字符串转换成二进制在比较是...
    99+
    2024-04-02
  • java如何比较两个字符串相等
    在Java中,可以使用equals()方法来比较两个字符串是否相等。equals()方法是String类的一个方法,用于比较两个字符...
    99+
    2023-08-22
    java
  • php中如何判断两个字符串等不等于
    这篇文章主要介绍“php中如何判断两个字符串等不等于”,在日常操作中,相信很多人在php中如何判断两个字符串等不等于问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”php中如何判断两个字符串等不等于”的疑惑有所...
    99+
    2023-06-29
  • php中怎么判断两个字符串等不等于(相等)
    本教程操作环境:windows7系统、PHP7.1版、DELL G3电脑php中判断字符串等不等于(相等)方法1:使用“===”运算符“===”是全等运算符,如果 $a 和 $b 不仅值相等,而且它们值的类型也相等,则返回 TRUE,否则返...
    99+
    2016-08-12
    php 字符串比较
  • Python字符串比较:如何判断两个字符串是否相等?
    Python字符串比较:如何判断两个字符串是否相等? 在Python编程中,字符串是最常用的数据类型之一。当我们需要比较两个字符串时,通常需要判断它们是否相等。这篇文章将详细介绍Python中比较两个字符串的方法。 使用“==”运算符比较...
    99+
    2023-08-22
    python 开发语言 java Python
  • JavaC++leetcode执行一次字符串交换能否使两个字符串相等
    目录题目要求思路:模拟JavaC++Rust题目要求 思路:模拟 Java class Solution { public boolean areAlmostEqual...
    99+
    2022-11-13
    Java C++ 字符串交换相等 Java C++
  • es6如何判断两个字符串是否相等
    这篇文章主要讲解了“es6如何判断两个字符串是否相等”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“es6如何判断两个字符串是否相等”吧! ...
    99+
    2024-04-02
  • shell怎么判断两个字符串是否相等
    在shell脚本中,可以使用以下方式来判断两个字符串是否相等:1. 使用等号(=)进行判断:```shellif [ "$strin...
    99+
    2023-08-16
    shell
  • php如何判断两个字符串是否相等
    这篇文章主要讲解了“php如何判断两个字符串是否相等”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php如何判断两个字符串是否相等”吧!方法一:使用“==”运算符最常见的方法是使用“==”运...
    99+
    2023-07-05
  • linux怎么判断两个字符串是否相等
    在Linux系统中,可以使用test命令或[ ]来判断两个字符串是否相等。以下是两种方法: 使用test命令: string1=...
    99+
    2024-03-01
    linux
  • 比较两个字符串是否相等的shell代码
    比较两个字符串是否相等的办法是: if [ "$test"x = "test"x ]; then 这里的关键有几点: 1 使用单个等号 2 注意到等号两边各有一个空格:这是unix shell的要求 3 注...
    99+
    2022-06-04
    字符串 两个 代码
  • php语言能分割两个字符吗
    这篇文章主要为大家展示了“php语言能分割两个字符吗”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“php语言能分割两个字符吗”这篇文章吧。php能分割字符,其方法是:1、通过explode函数实...
    99+
    2023-06-26
  • c语言怎么比较两个字符串是否相等
    在C语言中,可以使用strcmp函数来比较两个字符串是否相等。strcmp函数的原型为:int strcmp(const char ...
    99+
    2023-10-10
    c语言
  • 如何使用shell比较两个字符串是否相等
    这篇文章给大家分享的是有关如何使用shell比较两个字符串是否相等的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。比较两个字符串是否相等的办法是: if [ "$test"x = "t...
    99+
    2023-06-09
  • php中判断两个字符串是否相等的方法
    php 中判断字符串相等的方法包括:1. 严格相等运算符 (===) 比较内容和类型;2. 松散相等运算符 (==) 比较内容,容忍类型差异;3. strcmp() 函数进行字符比较,返...
    99+
    2024-04-29
  • php怎么判断两个字符串是否相等?多种方法分享
    在PHP中,判断两个字符串是否相等有多种方法。下面我们将详细介绍这些方法的使用和区别。方法一:使用“==”运算符最常见的方法是使用“==”运算符来判断两个字符串是否相等。例如:$str1 = "Hello"; $str2...
    99+
    2023-05-14
    php php字符串
  • PHP区分大小写比较两个字符串
    ...
    99+
    2024-04-02
  • PHP如何计算两个字符串的匹配度
    这篇文章主要讲解了“PHP如何计算两个字符串的匹配度”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PHP如何计算两个字符串的匹配度”吧!计算两个字符串匹配度(相似度),也就是计算两个字符串的...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作