内容简介:C++的存在像一把瑞士军刀,继承了C语言的设计理念——“充分相信程序员”,几乎将所有的底层细节都暴露在外,程序员可以自由控制。在最近详细学习Golang的过程中,发现Golang中的常用结构的设计理念与C++截然不同,为许多常用的操作都提供了语言设计者所认为的“最佳实践”。本文章仅讨论Golang中数组和切片。两者一样,都是线性的内存结构。数组的本质,即为编译器在编译期在数据段分配常量长度的内存,再填充上指定的数据。从这方面很容易理解,两者的数组的长度是不容许修改的。
1. 本文章的必要性
C++的存在像一把瑞士军刀,继承了 C语言 的设计理念——“充分相信程序员”,几乎将所有的底层细节都暴露在外,程序员可以自由控制。在最近详细学习Golang的过程中,发现Golang中的常用结构的设计理念与C++截然不同,为许多常用的操作都提供了语言设计者所认为的“最佳实践”。本文章仅讨论Golang中数组和切片。
2. Golang数组 和 C++数组(Array)
例子
C++ version
// const常量长度初始化 // 显然非常量无法作为初始化的长度,因为编译器在编译期无法确定要为此数组分配的内存长度 const int len = 10; int cpp_arr[len]; // 初始化赋值 int cpp_arr[] = {1, 2, 3, 4, 5};
Golang version
// const常量长度初始化 // 显然非常量无法作为初始化的长度,理由同上 const len := 10 var golang_arr [len]int // 初始化赋值 golang_arr := [...]int{1, 2, 3, 4, 5} // Golang额外提供了语法,用于初始化数组为同一元素 // 将golang_arr初始化为具有100个元素-1的数组 golang_arr := [...]int{100:-1}
内存模型
两者一样,都是线性的内存结构。数组的本质,即为编译器在编译期在数据段分配常量长度的内存,再填充上指定的数据。从这方面很容易理解,两者的数组的长度是不容许修改的。
参数传递
Linux进程内存模型
C++ version
C++的数组传参都只能靠指针
但对于指针的移动偏移无任何限制,只能靠 程序员 手动管理,如果读写越界,可能会破坏堆栈
int passArray(int arr[]) { // 合法 arr[0] = 0; // 不合法!可能会破坏进程地址空间中的内存布局 arr[-1000] = 0; } int main() { int arr[] = {1, 2, 3, 4, 5}; passArray(&arr[0]); return 0; }
golang version
// 通过改变ptr的指向,将ptr所指的内存置为空 // 原来的内存,GC可通过引用计数探测,将其释放 func passArrayByPointer(ptr *[32]int) { *ptr = [32]int{} } // 无效,只是对拷贝进行了一次赋值 func passArrayByValue(arr [32]int) { arr = [32]int{} }
- Golang对C++传递数组进行了限制和优化,将数组类型作为函数的形参时,必须显式的指定该数组的长度。在编译期,编译器也会对传入数组的长度与声明的长度进行比对,如果不相等则无法编译通过。
- 和其他高级语言不同(比如Java),语言中内置的类型有的为引用类型(在作为函数参数时直接传递引用),有的为值类型(在作为函数参数时传递一份拷贝),Golang在这方面引入了指针, 可以自由控制给函数传递的数组是拷贝,还是指针(这是传参时,与C++最大的不同)
总结
异
- 语法格式不同(废话)
- 作为参数传递时,长度Golang有严格的长度检查机制,防止写坏内存
- Golang中的数组是值语义,数组名即代表整个数组,而不像C/C++隐含为第一个元素的地址
同
- 内存布局一致
- 分配特性一致,即数组长度在编译期即确定,无法改变
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- Go 语言教程之浅谈数组和切片的异同
- DevOps与敏捷异同 - DZone DevOps
- Dart 入门 & 与 ts 类型系统的异同
- 浅谈集群、分布式、微服务的异同
- 【译】Array与Set的异同及使用场景
- 【译】Object与Map的异同及使用场景
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
算法统治世界——智能经济的隐形秩序
徐恪、李沁 / 清华大学出版社有限公司 / 2017-11-15 / CNY 69.00
今天,互联网已经彻底改变了经济系统的运行方式,经济增长的决定性要素已经从物质资料的增加转变成为信息的增长。但是,只有信息的快速增长是不够的,这些增长的信息还必须是“有序”的。只有“有序”才能使信息具有价值,能够为人所用,能够指导我们实现商业的新路径。这种包含在信息里的隐形秩序才是今天信息世界的真正价值所在。经济系统的运行确实是纷繁复杂的,但因为算法的存在,这一切变得有律可循,算法也成为新经济系统里......一起来看看 《算法统治世界——智能经济的隐形秩序》 这本书的介绍吧!