Golang中切片复制成本,一个大切片会比小切片占用更多内存吗?

原文链接:https://dave.cheney.net/2020/03/01/are-large-slices-more-expensive-than-smaller-ones

程序员有一个迷信的倾向,特别是当一个程序员听说拷贝操作是“昂贵”的(耗时耗内存),而拷贝操作随处可见,特别是当它学习Go的时候,每次赋值都是一次拷贝。

func f() {
       x, y := make([]byte, 9000), make([]byte, 9)
       a := x
       b := y
       // ...
 }

考虑下这个例子,xy大了三个数量级,那么把x赋值给a的操作会比把y赋值给b的操作更“昂贵”吗?

答案是:不会。xy是相同类型的,[]byte,也就是说是byte类型的切片,当两个变量是同类型的时候,它们的赋值涉及到的数据拷贝是相等的,它们有着相同的成本。

所有切片的大小都是一样的,有三个字段名,一个是指向后台数组的指针,一个是长度len,一个是容量cap。所以复制切片其实就是复制这三个字段名,所以再大的切片的复制操作和小切片相比也是一样的。

原文地址:https://www.cnblogs.com/Jun10ng/p/12702419.html

时间: 2024-08-13 17:25:53

Golang中切片复制成本,一个大切片会比小切片占用更多内存吗?的相关文章

一个由C/C++编译的程序占用的内存

一个由C/C++编译的程序占用的内存分为以下几个部分  1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈.  2.堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 .注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵.  3.全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的

Golang中使用heap编写一个简单高效的定时器模块

定时器模块在服务端开发中非常重要,一个高性能的定时器模块能够大幅度提升引擎的运行效率.使用Golang和heap实现一个通用的定时器模块,代码来自:https://github.com/xiaonanln/goTimer 也可以查看文档:http://godoc.org/github.com/xiaonanln/goTimer,下面是完整的代码,并进行适当的注释和分析. 从性能测试结果来看,基于heap的定时器模块在效率上并不会比时间轮(TimeWheel)的实现慢多少,但是逻辑上要简单很多.

golang中的数组切片

概念:基于数组,数组切片添加了一系列管理功能,可以随时动态扩充存放空间,并且不会导致所管理的元素被重复复制. 创建数组切片: 方法一,基于数组: package main import "fmt" func main() { //define an array var myArray [10]int = [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} //create a slice based on array var mySlice []int = m

golang中数组与切片的区别

初始化:数组需要指定大小,不指定也会根据初始化的自动推算出大小,不可改变 数组: a := [...]int{1,2,3} a := [3]int{1,2,3} 切片: a:= []int{1,2,3} a := make([]int, 5) a := make([]int, 5, 10) 函数传递:数组需要明确指定大小,切片不需要.数组是值传递,切片是地址传递 numbers2 := [...]int{1, 2, 3, 4, 5, 6} maxIndex2 := len(numbers2) -

利用文件打开方式with open('文件名',方式) as 变量名做一个简单的复制(排除大文件bug)

1 #!usr/bin/env python 2 #-*- coding=utf-8 -*- 3 4 with open('b.py','r') as obj1, open('c.py','w') as obj2: 5 for line in obj1.read(): 6 obj2.write(line) 将a.py的数据一行一行的进行复制 节省的了内存 另外 这种打开方式 免除了 之后需要的f.close() 对代码量上有细微的差距...(我自己想的...) 注意:第二个open不接with

python之路-利用索引切片功能做一个简易的两个未知数的加法计算器,代码如下:

python之路-利用索引切片功能做一个简易的两个未知数的加法计算器,代码如下: #content = input('请输入内容:'),如用户输入:5 +9或 5 + 9 等,然后进行分割再进行计算. content = input('>>>').strip() #content 等于所输入的内容,strip:删除字符串左右两边的空格. index = content.find('+') ''' content内容中的两边的空格都删除了,但中间还有,现在我们只需要定位已知内容是加法,两边

给定一个输入数据流,这个输入流很大,你不能将他们完全放在内存中。如何才能从这个输入流中随机的选取1000个数?

给定一个输入数据流,这个输入流很大,你不能将他们完全放在内存中.如何才能从这个输入流中随机的选取1000个数?

在主方法中定义一个大小为50的一维整型数组,数组i名为x,数组中存放着{1,3,5,…,99}输出这个数组中的所有元素,每输出十个换一行

package hanqi; import java.util.Scanner; public class Test7 { public static void main(String[] args) { //在主方法中定义一个大小为50的一维整型数组,数组i名为x,数组中存放着{1,3,5,…,99}输出这个数组中的所有元素,每输出十个换一行 int [] x=new int[50]; int a =1; for(int i=0;i<50;i++) { x[i]=a; a+=2; } for(

在主方法中定义一个大小为10*10的二维字符型数组,数组名为y,正反对角线上存的是‘*’,其余 位置存的是‘#’;输出这个数组中的所有元素。

//在主方法中定义一个大小为10*10的二维字符型数组,数组名为y,正反对角线上存的是‘*’,其余 位置存的是‘#’:输出这个数组中的所有元素. char [][]y=new char [10][10]; for(int i=0;i<10;i++) { for(int j=0;j<10;j++) { if(i==j||i+j==9) { y[i][j]='*'; } else { y[i][j]='#'; } } } for(int i =0;i<10;i++) { for(int k