工作中遇到的问题 -- Go避免内存拷贝的强制类型转换
创始人
2024-05-30 23:53:42
0

当你使用要对一个变量从一个类型强制转换成另一个类型,其实都会发生内存的拷贝,而这种拷贝会对性能有所影响的,因此如果可以在转换的时候避免内存的拷贝就好了。

庆幸的是,在一些特定的类型下,这种想法确实是可以实现的。

比如将字符串转成 []byte 类型。

// string to []byte
s1 := "hello"
b := []byte(s1)// []byte to string
s2 := string(b)

不发生内存拷贝的方法如下:

func main() {msg1 := "hello"sh := *(*reflect.StringHeader) (unsafe.Pointer(&msg1))bh := reflect.SliceHeader{Data: sh.Data,Len:  sh.Len,Cap:  sh.Len,}msg2 := *(*[]byte)(unsafe.Pointer(&bh))fmt.Printf("%v", msg2)
}

要理解这一段代码,我们需要3个知识点:

  • 一种定义变量怪异方法
  • 字符串的底层数据结构
  • 切片的底层数据结构

一种定义变量的怪异方法

name := (string) ("我真的很喜欢你")

那么我们再反过来看这一段代码:

tmp := *(*reflect.StringHeader)(unsafe.Pointer(&msg))

由于第一个括号里面是一个指针类型,那么第二个括号里面肯定是指针的值。

而通过 unsafe.Pointer 就可以将 &msg 指针的内存地址取出来。

两个括号合起来就是,声明并定义了一个 *reflect.StringHeader 类型的指针变量,对应的指针值还是原来 msg1 的内存地址。

那最前面的的那个那个 * ,大家应该都知道,是从*reflect.StringHeader 类型的指针变量中取出值。

然后我们来看一下StringHeader这个结构体:

type StringHeader struct {Data uintptrLen  int
}

同样的,SliceHeader则是切片的底层数据结构

type SliceHeader struct {Data uintptrLen  intCap  int
}

对咯,只要把 StringHeader 里的 Data 塞给 SliceHeader 里的 Data,再把 SliceHeader 里的 Len 塞给 SliceHeader 里的 Len 和 Cap ,就多费任何的空间创造出一个新的变量。

bh := reflect.SliceHeader{Data: sh.Data,Len:  sh.Len,Cap:  sh.Len,
}

最后再把 SliceHeader 通过上面的强制转换方法,再转成 []byte 就可以了,中间就不会有任何的内存拷贝的过程。

相关内容

热门资讯

天下第一宫—黄帝... 天下第一宫—黄帝宫游览区导游词  作为一位兢兢业业的旅游从业人员,总不可避免地需要编写导游词,导游词...
导游词之大九湖 导游词之大九湖  我们今天游览的是被称其为湖北的“呼伦贝尔”的大九湖风景区,大九湖并非湖,而是一片沼...
上饶三清山导游词 上饶三清山导游词(通用9篇)  作为一名乐于助人的导游,通常需要用到导游词来辅助讲解,导游词具有形象...
洪崖丹井导游词 洪崖丹井导游词3篇  作为一名尽职尽责的导游,编写导游词是必不可少的,导游词具有注重口语化、精简凝练...
沈阳新乐遗址导游词 关于沈阳新乐遗址导游词范文  新乐文化遗址位于沈阳市皇姑区黄河北大街北运河北岸黄土高台之上,1977...
西山导游词 西山导游词(15篇)  作为一名专门为游客提供优质服务的导游人员,编写导游词是必不可少的,导游词具有...
介绍北京的导游词 介绍北京的导游词(通用10篇)  导游词是导游人员引导游客观光游览时的讲解词,是导游员同游客交流思想...
小小三峡导游词 小小三峡导游词(精选8篇)  作为一位兢兢业业的旅游从业人员,通常需要准备好一份导游词,导游词由引言...
烟台海昌鲸鲨馆导游词 烟台海昌鲸鲨馆导游词3篇  篇一:烟台海昌鲸鲨馆导游词  来到鲸鲨馆门前,别具一格的螺状建筑展现在眼...
神农架导游词 神农架导游词推荐  神农架于1986年经国务院批准为国家级森林和野生动物自然保护区。  神农架区为湖...
云南九乡导游词 云南九乡导游词  导游词是导游人员引导游客观光游览时的讲解词,是导游员同游客交流思想,向游客传播文化...
五台山殊像寺导游词 五台山殊像寺导游词  导语:对五台山的殊像寺,导游会怎样解说?下面是小编整理的五台山殊像寺导游词,欢...
孝感董永公园导游词 孝感董永公园导游词  董永公园位于孝感市,国家AAAA级旅游景区,位于孝感市城区槐荫大道东段,距武汉...
拜将台的导游词 拜将台的导游词  我们现在就来到了拜将台。拜将台作为汉初三遗址之一,它坐落在汉中城南,是刘邦拜韩信为...
庐陵文化生态园导游词 庐陵文化生态园导游词  庐陵文化生态园位于江西省吉安市吉州区城北、赣江之滨,整个公园是利用螺子山山体...
玉林都峤山导游词 玉林都峤山导游词  作为一位尽职的导游,可能需要进行导游词编写工作,导游词可以加深游客对景点的印象,...
山西省榆次常家庄园简介导游词 山西省榆次常家庄园简介导游词  常家庄园位于榆次西南东阳镇车辋村,距榆次17.5公里。车辋由四个小自...
黄山的景点导游词 黄山的景点导游词(通用7篇)  作为一名导游,通常需要准备好一份导游词,导游词一般是根据实际的游览景...
西双版纳热带植物园导游词 西双版纳热带植物园导游词推荐  各位朋友,大家好。今天我们将游览闻名遐迩、风光绚丽的中国科学院西双版...
浙江仙华山导游词 浙江仙华山导游词  作为一名具备丰富知识的导游,通常会被要求编写导游词,导游词事实上是一种对旅游景点...