https://www.cnblogs.com/shuiyuejiangnan/p/9707066.html
https://blog.csdn.net/slphahaha/article/details/109405685
cuishuangtodo
前文预览:
浅拷贝和深拷贝
浅拷贝(也称为位拷贝)就是拷贝指向对象的指针,即拷贝出来的目标对象的指针和源对象的指针指向的内存空间是同一块空间 (改其中一个会影响到另外一个)。浅拷贝只是一种简单的拷贝,让几个对象共用一个内存。 浅拷贝可能会有数据安全方面的隐患
深拷贝则是另辟了一个完全独立的内存空间,源对象与拷贝对象互相独立,改其中一个不会影响
另外一个。 但需为新的变量 重新分配一块内存
string(byteSli)操作,会为新生成的str,重新分配(一块)内存吗
Go源码里大多都是[]byte而不是string:想改变其中几个字符的时候直接通过下标修改[]byte里面的内容,在需要string的时候通过string([]byte)得到字符串。这可以提高效率,还不会产生太多的子字符串浪费内存,导致GC任务加重
但如下细节需注意:
用 string(字节数组)方式转换生成的字符串,是重新开辟了一块内存(如str := string(byteSli))。在转换后,再去修改原来byteSli的某几个字符(如byteSli[1] = 'x'),str将不会跟随改变 (str[1]还是原来的字符,而不是’x’)
1 | package main |
输出为:
1 | (string) (len=7) "byteSli" |
内存地址不同,给str新分配(一块)内存,可以写benchmark验证一下
byte切片转字符串,有没有可以零拷贝的方式?
当然有,使用unsafe的方式
一些底层实现和细节
参考:
面试官:string和[]byte转换原理知道吗?会发生内存拷贝吗?
原文链接: https://dashen.tech/2022/04/03/string和-byte转换会发生内存拷贝吗/
版权声明: 转载请注明出处.