Go语言有什么优势?GO语言的优势:可直接编译成机器码,不依赖其他库 , glibc的版本有一定要求,部署就是扔一个文件上去就完成了 。静态类型语言,但是有动态语言的感觉,静态类型的语言就是可以在编译的时候检查出来隐藏的大多数问题,动态语言的感觉就是有很多的包可以使用,写起来的效率很高 。语言层面支持并发,这个就是Go最大的特色,天生的支持并发,我曾经说过一句话,天生的基因和整容是有区别的,大家一样美丽,但是你喜欢整容的还是天生基因的美丽呢?Go就是基因里面支持的并发,可以充分的利用多核,很容易的使用并发 。内置runtime,支持垃圾回收 , 这属于动态语言的特性之一吧 , 虽然目前来说GC不算完美,但是足以应付我们所能遇到的大多数情况,特别是Go1.1之后的GC 。简单易学,Go语言的作者都有C的基因,那么Go自然而然就有了C的基因 , 那么Go关键字是25个,但是表达能力很强大 , 几乎支持大多数你在其他语言见过的特性:继承、重载、对象等 。丰富的标准库,Go目前已经内置了大量的库,特别是网络库非常强大,我最爱的也是这部分 。内置强大的工具,Go语言里面内置了很多工具链,最好的应该是gofmt工具 , 自动化格式化代码,能够让团队review变得如此的简单,代码格式一模一样,想不一样都很困难 。跨平台编译,如果你写的Go代码不包含cgo , 那么就可以做到window系统编译linux的应用,如何做到的呢?Go引用了plan9的代码,这就是不依赖系统的信息 。Go语言这么多的优势,你还不想学吗?我记得当时我看的是黑马程序员的视频,我对他们视频的印象就是通俗易懂,就是好!
内存对齐问题1.平台原因(移植原因): 不是所有go语言内存分布的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能
在某些地址处取某些特定类型的数据go语言内存分布,否则抛出硬件异常 。
2.性能原因: 数据结构应该尽可能地在自然边界上对齐 。原因在于 , 为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问 。(如果是对齐的,那么CPU不需要跨越两个操作字,不是对齐的则需要访问两个操作字才能拼接出需要的内存地址)
指针的大小一般是一个机器字的大小
通过Go语言的structlayout工具,可以得出下图
这些类型在之前的 slice 、 map 、 interface 已经介绍过了 , 也特意强调过,makehmap函数返回的是一个指针 , 因此map的对齐为一个机器字.
回头看看 sync.pool的防止copy的空结构体字段,也是放在第一位,破案了 。
计算机结构可能会要求内存地址 进行对齐;也就是说,一个变量的地址是一个因子的倍数,也就是该变量的类型是对齐值 。
函数Alignof接受一个表示任何类型变量的表达式作为参数,并以字节为单位返回变量(类型)的对齐值 。对于变量x:
这是因为int64在bool之后未对齐 。
它是32位对齐的,但不是64位对齐的,因为我们使用的是32位系统 , 因此实际上只是两个32位值并排在一起 。
● 内存对齐是为了cpu更高效访问内存中数据
● 结构体对齐依赖类型的大小保证和对齐保证
● 地址对齐保证是:如果类型 t 的对齐保证是 n,那么类型 t 的每个值的地址在运行时必须是 n 的倍数 。
● struct内字段如果填充过多 , 可以尝试重排,使字段排列更紧密,减少内存浪费
● 零大小字段要避免作为struct最后一个字段,会有内存浪费
● 32位系统上对64位字的原子访问要保证其是8bytes对齐的;当然如果不必要的 话,还是用加锁(mutex)的方式更清晰简单
推荐阅读
- 魔术录屏直播软件,录屏魔术手
- 包含女主播为什么要吃饭视频的词条
- 宝塔修改redis,宝塔修改数据库密码
- 钉钉直播显示屏共享屏幕,钉钉直播怎么共享屏幕时是不是就看不见人了?
- php数据输出格式 php的输出语句
- 新媒体运营如何制作ppt内容,新媒体运营如何制作ppt内容
- 怎么把word中的箭头去掉,怎么把word中的箭头去掉呢
- vb.net日历 vb编程制作简单日历
- 如何宣传一个新媒体号呢,如何宣传自己的产品