当前位置: 首页 > news >正文

jsp网站开发的使用表格电子商务网站建设的核心是

jsp网站开发的使用表格,电子商务网站建设的核心是,directory wordpress,2017网站建设报价表Golang系列-内存对齐 常见类型header的size大小内存对齐空结构体类型参考 摘要: 本文将围绕内存对齐展开, 包括字符串、数组、切片等类型header的size大小、内存对齐、空结构体类型的对齐等等内容. 关键词: Golang, 内存对齐, 字符串, 数组, 切片 常见类型header的size大小 首…

Golang系列-内存对齐

      • 常见类型header的size大小
      • 内存对齐
      • 空结构体类型
      • 参考

摘要: 本文将围绕内存对齐展开, 包括字符串、数组、切片等类型header的size大小、内存对齐、空结构体类型的对齐等等内容.
关键词: Golang, 内存对齐, 字符串, 数组, 切片

常见类型header的size大小

首先看下面程序的输出, 对于字符串、数组、切片这三种类型, 通过unsafe.SizeOf 获取其在内存中占用的字节数.

package mainimport ("fmt""unsafe"
)func main() {str1 := ""str2 := "Hello, World!"arr1 := [0]int{}arr2 := [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}slice1 := []int{}slice2 := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}fmt.Printf("str1: %d\n", unsafe.Sizeof(str1))fmt.Printf("str2: %d\n", unsafe.Sizeof(str2))fmt.Printf("arr1: %d\n", unsafe.Sizeof(arr1))fmt.Printf("arr2: %d\n", unsafe.Sizeof(arr2))fmt.Printf("slice1: %d\n", unsafe.Sizeof(slice1))fmt.Printf("slice2: %d\n", unsafe.Sizeof(slice2))
}

在64位机器下输出如下:
在这里插入图片描述
首先来说数组, 由于数组的大小是确定的, 所以其占用的内存字节书就是等于其长度 乘以 数据类型的大小, 在64位机器上, int占用8个字节, 所以空数组和长度为10的数组分别占用0和80个字节. 而字符串和切片的长度是不确定的, 在golang语言中, 其分别用如下的结构体来表示:

type stringHeader struct {Data uintptrLen  int
}type SliceHeader struct {Data uintptrLen  intCap  int
}

uintptr 在64位机器下也是占用8个字节, 所以字符串和切片在内存中占用的字节数是固定的, 分别为16和24.

内存对齐

实际上golang语言中也存在和C语言类似的内存对齐, 其目的有如下几点:

  • 性能优化: 结构体中的每一个成员的首地址都是自己类型大小的整数倍, 这样保证了只需要通过一次内存操作就能够取出这个数
  • 原子操作: 同时, 如果能够在一次内存操作中完成一个数据的读出, 也能保证操作的原子性
  • 平台原因: 部分平台限制任意地址的读取
    内存对齐大致上有两个要求, 一个是每一个数据成员的起始地址必须是该数据成员字节长度的整数倍, 另外一个是整个结构体的大小是这个结构体对齐长度的整数陪, 结构体对齐长度为这个结构体中最大的数据类型的字节长度于机器位长的最小值.

空结构体类型

如果在一个结构体中有一个数据成员的类型是空结构体呢, 那么这个会给内存对齐带来什么影响? 先看如下程序运行的结果:

package mainimport ("fmt""unsafe"
)type DemoStruct1 struct {A int32D struct{}
}type DemoStruct2 struct {D struct{}A int32
}func main() {a1 := DemoStruct1{}a2 := DemoStruct2{}fmt.Printf("a1: size=%d, structAddr: %d, AAddr: %d, emptyStructAddr: %d\n", unsafe.Sizeof(a1), unsafe.Pointer(&a1), unsafe.Pointer(&a1.A), unsafe.Pointer(&a1.D))fmt.Printf("a2: size=%d, structAddr: %d, AAddr: %d, emptyStructAddr: %d\n", unsafe.Sizeof(a2), unsafe.Pointer(&a2), unsafe.Pointer(&a2.A), unsafe.Pointer(&a2.D))
}

在64位机器上输出如下:
在这里插入图片描述
可以看到, 如果空结构体数据成员是最后一个数据成员, 那么其会占用一个字节, 如果不是最后一个数据成员, 那么不会占用字节. 其原因是出于内存泄漏的考虑, 如果空结构体数据成员是结构体最后一个数据成员的时候, 如果其不占用字节, 那么其指针就会指向结构体外, 如果这个指针不被释放, 那么那一块内存就不会被释放, 而通过占用字节, 那么空结构体指针也会指向结构体内部, 避免内存泄漏的问题.

参考

  • golang内存对齐详解
http://www.dtcms.com/a/406192.html

相关文章:

  • 快速将多个PPT、PPTX幻灯片统一转换成浏览器能直接打开的HTML网页文件
  • IROS 2025将于10月在中国杭州举办,爱迪斯通携手机器人训练与遥操作专家XSENS、HAPTION参展
  • 后海做网站公司网址搜索引擎入口
  • Java之链表
  • IDEA 高效配置指南:从基础到进阶的设置全解析
  • 用 SeaTunnel 同步 MySQL 到 Doris:全量增量 + SQL 过滤
  • C++项目:仿muduo库高并发服务器--------Any类的实现
  • ELK 企业级日志分析系统实战教程
  • 驻马店怎么建设自己的网站wordpress 导出到pdf
  • 网站建设成本表一般什么行业做网站的多
  • 阳台光伏、储能系统再升级!双路电能表,您家能源的“智能管家”
  • 【Unity 入门教程】四、如何制作一个 Perfab
  • 浅谈高校门户网站建设的规范标准找做废薄膜网站
  • Word和WPS文字中的题注没有更新?全选按F9刷新
  • Spring Boot集群 集成Nginx配置:负载均衡+静态资源分离实战
  • 本地生活软件开发指南:从用户需求到商业闭环的实战逻辑
  • 建设网站需要租赁主机吗重庆模板建站代理
  • CSP-J/S初赛赛后总结
  • Leetcode 208. 实现 Trie (前缀树)
  • 国际型网站建设wordpress换网址插件
  • Dlib+OpenCV 人脸轮廓绘制
  • Spring Boot 整合 MySQL 和 Druid
  • 基于 STM32 的智能马桶控制系统设计与实现
  • SpringCloud 项目阶段九:Kafka 接入实战指南 —— 从基础概念、安装配置到 Spring Boot 实战及高可用设计
  • 徐州企业建站模板一个网站的制作过程
  • phpmysql网站开发项目式教程房地产开发公司招聘
  • python+springboot+uniapp基于微信小程序的巴马旅居养老系统 旅游养老小程序
  • 阿里云无影发布首个Agentic Computer形态的个人计算产品
  • PHP 8.0+ 元编程与编译时优化:构建下一代PHP框架
  • aws用ami新创建之后用密码登录不了