struct 内存布局 | 学习笔记

简介: 快速学习 struct 内存布局

开发者学堂课程【Go语言核心编程 - 面向对象、文件、单元测试、反射、TCP编程struct 内存布局】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/626/detail/9668


struct 内存布局

内容介绍:

一、结构体与结构体变量的区别与联系

二、结构体变量的内存布局

 

一、结构体与结构体变量的区别与联系

通过上节课的案例和讲解,可以发现结构体与结构体变量之间存在着某些相同点与不同点,如下:

1.区别

(1)结构体是一种自定义的数据类型,这是其本质,其代表一类事物。如 type Cat struct 则定义了一个结构体 Cat,这里的结构体代表“猫”这种事物

(2)结构体变量(实例)是具体的、实际的,代表一个具体变量。如 var cat1 Cat 则是定义了一个实际存在的结构体变量 cat1

2. 联系

该部分内容在上节课“Go 面向对象编程快速入门”中“结构体与结构体变量关系示意图中”有作讲解。

 

二、结构体变量的内存布局(重点)

package main

import (

"fmt"

)

type Cat struct {

Name string

Age int

Color int

Hobby string

}

func main() {

var cat1 Cat    

fmt.printf("cat1的地址=%p\n",&cat1)

cat1.Name = "小白"

cat1.Age = 3

cat1.Color = "白色"

cat1.Hobby = "吃<・)))><<"

fmt.Println("猫猫的信息如下:")

fmt.Println("name=",cat1.Name)

fmt.Println("age=",cat1.Age)

fmt.Println("color=",cat1.Color)

fmt.Println("hobby=",cat1.Hobby)

}

输出结果:

cat1的地址=0xc0420340c0

猫猫的信息如下:

name= 小白

age= 3

color= 白色

hobby= 吃<・)))><<

结构体 Cat 中创建的结构体变量 cat1在内存中的示意图如下:

(1)当代码执行“var cat1 Cat”结束时,结构体变量在内存中的存在形式与结构体本身的定义(即数据类型)密切相关。cat1变量直接指向了结构体 Cat,且结构体Cat结构体中有分为四部分,每部分各自对应“Name”“Age”“Color”“Hobby”4个字段,由于未赋值,故string类型的变量“Name”“Color”“Hobby”显示为空字符串"",int 型变量“Age”显示为默认值“0”。该过程中,cat1变量直接指向结构体的数据空间,而并没有先经过地址空间,再指向结构体,说明在 Go 语言面向对象编程中,结构体是值类型,而不是引用类型,但在其他的很多编程语言中,结构体不一定是值类型。

(2)当代码执行“cat1.Name = "小白"”时,可通过 cat1访问至 Cat 结构体中 Name 字段,记录值由空字符串""变为“小白”(①);同理,当代码执行“cat1.Age = "3"”时,可通过cat1访问至 Cat 结构体中 Age 字段,记录值由默认值“0”变为“3”4(②);当代码执行“cat1.Color = "白色"”时,可通过 cat1访问至 Cat 结构体中 Color 字段,记录值由空字符串""变为“白色”(③);当代码执行“cat1.Hobby = "吃<・)))><<"”时,可通过 cat1访问至 Cat 结构体中 Hobby 字段,记录值由空字符串""变为“吃<・)))><<”(④)。示意图如下:

image.png

总结:

1)当声明一个结构体变量时,其数据空间即存在,在对变量赋值前,其各个属性的默认值也已存在;

2)结构体变量/结构体是值类型。

相关文章
|
2月前
|
存储 编译器 程序员
【C语言】内存布局大揭秘 ! -《堆、栈和你从未听说过的内存角落》
在C语言中,内存布局是程序运行时非常重要的概念。内存布局直接影响程序的性能、稳定性和安全性。理解C程序的内存布局,有助于编写更高效和可靠的代码。本文将详细介绍C程序的内存布局,包括代码段、数据段、堆、栈等部分,并提供相关的示例和应用。
66 5
【C语言】内存布局大揭秘 ! -《堆、栈和你从未听说过的内存角落》
|
2月前
|
机器学习/深度学习 人工智能 缓存
【AI系统】推理内存布局
本文介绍了CPU和GPU的基础内存知识,NCHWX内存排布格式,以及MNN推理引擎如何通过数据内存重新排布进行内核优化,特别是针对WinoGrad卷积计算的优化方法,通过NC4HW4数据格式重排,有效利用了SIMD指令集特性,减少了cache miss,提高了计算效率。
65 3
|
4月前
|
存储 Java
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
这篇文章详细地介绍了Java对象的创建过程、内存布局、对象头的MarkWord、对象的定位方式以及对象的分配策略,并深入探讨了happens-before原则以确保多线程环境下的正确同步。
78 0
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
|
4月前
|
存储 Java
深入理解java对象的内存布局
这篇文章深入探讨了Java对象在HotSpot虚拟机中的内存布局,包括对象头、实例数据和对齐填充三个部分,以及对象头中包含的运行时数据和类型指针等详细信息。
39 0
深入理解java对象的内存布局
|
6月前
|
存储 算法 Oracle
不好意思!耽误你的十分钟,JVM内存布局还给你
先赞后看,南哥助你Java进阶一大半在2006年加州旧金山的JavaOne大会上,一个由顶级Java开发者组成的周年性研讨会,公司突然宣布将开放Java的源代码。于是,下一年顶级项目OpenJDK诞生。Java生态发展被打开了新的大门,Java 7的G1垃圾回收器、Java 8的Lambda表达式和流API…大家好,我是南哥。一个Java学习与进阶的领路人,相信对你通关面试、拿下Offer进入心心念念的公司有所帮助。
不好意思!耽误你的十分钟,JVM内存布局还给你
|
6月前
|
缓存 Java 编译器
Go 中的内存布局和分配原理
Go 中的内存布局和分配原理
|
6月前
|
存储 编译器 C++
Method&ConstMethod的内存布局
综上所述,常规方法和常量方法在对象的内存布局中并不直接占据空间;它们作为代码的一部分存储在程序的代码段中。对于虚方法(包括常量虚方法),它们通过VTable在对象中有表示,但即便在这种情况下,方法代码本身也不在对象的内存布局中。理解这些概念有助于深入理解面向对象编程,提高编程效率和代码的可理解性。
49 3
|
5月前
crash —— 获取物理内存布局信息
crash —— 获取物理内存布局信息
|
6月前
|
存储 NoSQL 程序员
C语言中的内存布局
C语言中的内存布局
71 0
|
6月前
|
存储 程序员 编译器
c++学习笔记08 内存分区、new和delete的用法
C++内存管理的学习笔记08,介绍了内存分区的概念,包括代码区、全局区、堆区和栈区,以及如何在堆区使用`new`和`delete`进行内存分配和释放。
61 0