首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C语言——结构类型(二)【结构内存对齐,结构数组】

猜测:两个结构里面都是两个char,一个int,那他们的内存大小应该一样吧 但是,输出结果 很显然,尽管这两个结构变量的成员差不多,但是这两个结构变量的大小却不一样。...这就是因为结构类型的变量在开辟内存的时候,要遵循结构内存对齐,只有对齐到符合的地址处时,才会开始为成员分配内存 在了解如何对齐前,我们先来了解对齐数这个概念 ① 一个变量的对齐数 = 编译器默认的对齐数...) 接下来我们就来介绍一下结构内存对齐的规则: 1,结构的第一个成员对齐到与结构变量起始位置的偏移量为0的地址处(简单来说就是第一个成员变量的内存从起始位置开始分配) 2,其他成员变量要对齐到...与起始位置的偏移量为这个变量的对齐数的整数倍的地址处,然后再开始分配内存 3,结构的总大小应该为 所有成员中最大对齐数 的整数倍 2,例子分析 我们计算结构的大小的一般流程如下 了解了上面的知识以后...birthday的对齐数 2,birthday成员的大小,birthday也是一个结构,也要用结构内存对齐的方式来计算大小 具体分配如下: 二,结构数组 1,什么是结构数组 结构数组,

20510

结构内存对齐规则

1.结构内存对齐规则 1.第一个成员在与结构变量偏移量为0的地址处。 2.其他成员变量都放在对齐数(成员的大小和默认对齐数的较小值)的整数倍的地址处。...4.如果嵌套了结构的情况,嵌套的结构对齐到自己的最大对齐数的整数倍处,结构的整体大小就是所有最大对齐数(含嵌套结构的对齐数)的整数倍。...2.例子 1、例一 2、例二 3.为什么存在内存对齐 参考了大部分资料,大部分都这么说: 1.平台原因(移植问题): 不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据...2.性能原因: 数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。...总的来说: 结构内存对齐是拿空间来换取时间的做法 既然这样,那在设计结构的时候,我们既要满足对齐,又要节省空间,如何做到:让占用空间小的成员尽量集中在一起。

44710
您找到你想要的搜索结果了吗?
是的
没有找到

【Linux 内核 内存管理】物理内存组织结构 ④ ( 内存区域 zone 简介 | zone 结构源码分析 | zone 结构源码 )

文章目录 一、内存区域 zone 简介 二、zone 结构源码分析 1、watermark 成员 2、lowmem_reserve 成员 3、zone_pgdat 成员 4、pageset 成员 5...内存管理系统 3 级结构 : ① 内存节点 Node , ② 内存区域 Zone , ③ 内存页 Page , Linux 内核中 , 使用 上述 3 级结构 描述 和 管理 " 物理内存 "...struct zone 结构类型进行描述 , zone 枚举定义在 Linux 内核源码的 linux-4.12\include\linux\mmzone.h#350 位置 ; 每个 " 内存区域..." , 都使用 1 个 zone 结构 描述 ; 二、zone 结构源码分析 ---- 1、watermark 成员 watermark 表示 " 页分配器 " 使用的 水线 ; /* zone...*/ struct free_area free_area[MAX_ORDER]; 三、zone 结构源码 ---- zone 结构源码 : struct zone { /* Read-mostly

4.4K30

C进阶:结构内存对齐

一.为什么存在内存对齐 大部分的参考资料都是如是说的: 1....性能原因: 数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。...总体来说: 结构内存对齐是拿空间来换取时间的做法。 二.内存对齐规则 1. 第一个成员在与结构变量偏移量为0的地址处。 2....如果嵌套了结构的情况,嵌套的结构对齐到自己的最大对齐数的整数倍处,结构的整体大小就是所有最大对齐数(含嵌套结构的对齐数)的整数倍。 什么意思呢?...1中的一样,但顺序却不一样; 不过不用担心,他们内存对齐的规则还是一样的; vs2022 打印结果: 通过上面两个例子,我们发现,即使结构的成员类型相同,结构内存大小最后可能还是不同,我们最好把小类型的写在一起

14810

【Linux 内核 内存管理】物理内存组织结构 ③ ( 内存管理系统三级结构 | 内存节点描述 | 内存节点 pglist_data 结构 | pglist_data 结构源码 )

文章目录 一、内存节点描述 二、内存节点 pglist_data 结构 三、pglist_data 结构源码 内存管理系统 3 级结构 : ① 节点 Node , ② 区域 Zone , ③ 页...Page , Linux 内核中 , 使用 上述 3 级结构 描述 和 管理 " 物理内存 " ; 一、内存节点描述 ---- Linux 内核中 , 内存节点 ( Node ) 是 " 内存管理...物理地址连续 的内存块 是一个 " 内存节点 " ; 二、内存节点 pglist_data 结构 ---- Linux 内核中 , 使用 pglist_data 结构 描述 " 内存节点 " , 该结构定义在...total size of physical page range, including holes */ // 节点标识符 int node_id; 三、pglist_data 结构源码...---- Linux 内核中 , 使用 pglist_data 结构 描述 " 内存节点 " , 该结构定义在 Linux 内核源码中的 linux-4.12\include\linux\mmzone.h

1.7K10

【C 语言】结构 ( 结构中嵌套一级指针 | 分配内存时先 为结构分配内存 然后再为指针分配内存 | 释放内存时先释放 指针成员内存 然后再释放结构内存 )

文章目录 一、结构中嵌套一级指针 1、声明 结构类型 2、为 结构 变量分配内存 ( 分配内存时先 为结构分配内存 然后再为指针分配内存 ) 3、释放结构内存 ( 释放内存时先释放 指针成员内存...然后再释放结构内存 ) 二、完整代码示例 一、结构中嵌套一级指针 ---- 1、声明 结构类型 声明 结构类型 : 这里注意 , 在结构中 , 定义一个 一级指针 变量 , 注意与 数组类型区别..., 向堆内存赋值 char *address; }Student; 2、为 结构 变量分配内存 ( 分配内存时先 为结构分配内存 然后再为指针分配内存 ) 为 结构 变量分配内存 : 结构...内存分配完成之后 , 需要立刻为 结构的 一级指针 成员分配内存 ; /** * @brief create_student 堆内存中分配内存 * @param array 二级指针 , 指向结构数组...指针成员内存 然后再释放结构内存 ) 释放结构内存 : 释放 结构 内存时 , 要先释放 结构变量 的 一级指针 成员的内存 , 然后再释放整个 结构内存 ; /** * @brief

2.1K30

Go 空结构:零内存的魔力

它有以下两种定义方式:匿名空结构var e sruct{}命名空结构type EmptyStruct struct{}var e EmptyStruct空结构的特点空结构主要有以下几个特点:零内存占用地址相同无状态零内存占用空结构不占用任何内存空间...,这使得空结构内存优化方面非常有用,我们来通过例子看看是否真的是零内存占用:package mainimport ( "fmt" "unsafe")func main() { var a...这使得空结构在表示无状态的对象或情况时非常有用。为什么是零内存和地址相同要理解为什么空结构内存上是零大小(零内存)并且多个空结构的地址是相同的,需要深入研究 Go 的源码。...由于 CMY 结构为空结构,因此不会带来额外的内存开销。...小结在本文中,首先介绍了 Go 语言 空结构 的概念和定义方式,它有两种定义方式;随后对 空结构 的特点进行介绍,包括其零内存和多个变量地址相同的特性;接着进一步深入源码,探究了为什么空结构在 Go

37611

结构的大小与内存对其

最近在群里看到了有人问起结构的大小问题,好多人的都不太明白。因此写篇文章总结一下。顺便再提一下结构本身。...struct MyStruct { int a; double b; char c; }; 这就是一个结构。他可以包含一些基本的数据类型,也可以包含结构类型。...结构的末尾记得要加一个“分号”。我们首先来看一下这个结构的大小。 ? 这个结构占用了24个字节,看来在默认情况下,结构的大小是按照其占用内存最多的成员变量来进行内存对其的。...注意,我们只是交换了变量的顺序,结构的大小就变得不一样了,这是因为在编译器给结构的成员分配内存的时候是按照我们所写的顺序来分配内存的,所以当int和char之间隔了一个double的时候,就变成各自占据...当然,我们也可以使用#pragma这个预处理指令来设置结构内存对其的标准。 #pragma pack(n),就可以按照所设置的n的大小来对其内存,当然n不能小于1,参数应该按照这样来设置: ?

75420

【C 语言】结构 ( 结构 数组 作为函数参数 | 数组 在 栈内存创建 )

文章目录 一、结构 数组 作为函数参数 ( 数组 在 栈内存创建 ) 二、完整代码示例 一、结构 数组 作为函数参数 ( 数组 在 栈内存创建 ) ---- 声明结构类型 : 定义 结构 数据类型..., 同时为该结构类型声明 别名 , 可以直接使用 别名 结构变量名 声明结构类型变量 , 不需要在前面添加 struct 关键字 ; typedef struct Student { char...name[5]; int age; int id; }Student; 栈内存中声明结构数组 : // 声明结构数组 , 该数组在栈内存中 Student array...: 使用 结构数组 作为参数 , 可以进行间接赋值 , 修改该 结构数组 的元素 , 可以当做返回值使用 ; 此时结构 数组 会退化为 结构指针 ; /** * @brief sort_struct_array...对结构数组 按照年龄进行排序 * @param array 结构指针 * @param count 结构数组的元素个数 */ void sort_struct_array(Student

1.5K20

【C 语言】结构 ( 结构 数组 作为函数参数 | 数组 在 堆内存创建 )

文章目录 一、结构 数组 作为函数参数 ( 数组 在 堆内存创建 ) 二、完整代码示例 一、结构 数组 作为函数参数 ( 数组 在 堆内存创建 ) ---- 在上一篇博客 【C 语言】结构 ( 结构...数组 作为函数参数 | 数组 在 栈内存创建 ) 的基础上 , 将 栈内存 中的 结构数组 , 更改为 堆内存 中创建结构数组 ; 在堆内存中 , 创建 结构数组 : 传入 二级指针 , 该指针...指向 结构 指针 , 传入 二级指针 的目的是 , 可以在函数中 , 通过形参 间接赋值 , 达到返回创建堆内存的目的 ; /** * @brief create_student 堆内存中分配内存...结构 数组 : 传入的参数是 二级指针 , 通过该 二级指针 指向 结构一级指针 , 将 结构指针 置空 ; /** * @brief free_student 释放内存 * @param..., 该数组在栈内存中 Student *array = NULL; // 循环控制变量 int i = 0; // 堆内存中为结构指针分配内存 create_student

1.3K30

JAVA内存结构解析

原文链接:http://tryenough.com/java-memory-structure 更多:http://tryenough.com/type-android Java内存结构大体示意图: [...如果当前线程正在执行Java方法,则程序计数器保存的是虚拟机字节码的内存地址,如果正在执行的是Native方法(非Java方法,JVM底层有许多非Java编写的函数实现),计数器则为空。...虚拟机栈   虚拟机栈(Java Virtual Machine Stacks)和线程是紧密联系的,每创建一个线程时就会对应创建一个Java栈,所以Java栈也是"线程私有"的内存区域,这个栈中又会对应包含多个栈帧...虚拟机栈是一个后入先出的数据结构,线程运行过程中,只有一个栈帧是处于活跃状态的,被称为"当前活动帧栈",当前活动帧栈始终是虚拟机栈的栈顶元素。...堆   堆(heap)是存储java实例或者对象的地方,是GC的主要区域,同样是线程共享的内存区域。

56800

【C 语言】结构 ( 结构变量内存操作 | 通过 “ . “ 操作符操作结构内存空间 | 通过 “ -> “ 操作符操作结构内存空间 )

操作符操作 结构 内存空间 , . 操作符 是 寻址操作 , 计算结构 age 成员距离 距离 t3 变量的偏移量 ; 注意 : 只有 结构 变量 才能使用 ....操作符操作 结构 内存空间 Teacher t3; // 为 name 结构成员赋值 strcpy(t3.name, "Tom"); // ....--- 通过 -> 操作符操作 结构 内存空间 , -> 操作符 是 获取指针指向的内存数据 , 也是寻址操作 , 计算结构 age 成员距离 距离 t3 变量的偏移量 ; 注意 : 只有 指向 结构...变量 的指针 才能使用 -> 操作符 , 结构变量 , 不能使用该操作符 ; 代码示例 : // 通过 -> 操作符操作 结构 内存空间 Teacher t4; Teacher...操作符操作 结构 内存空间 Teacher t3; // 为 name 结构成员赋值 strcpy(t3.name, "Tom"); // .

25410

java数组内存结构

译自:programcreek Java中的数组存储两种东西之一:要么是原始值(int, char, ...),或是引用(即指针)。...当一个对象通过"new"创建时,将会在堆内存分配空间,并且返回一个引用。这对于数组也是一样的,因为数组是对象。...假设你创建一个长度为10的整型数组,也是相同的 —— 分配内存,返回一个引用。 ? 2.二维数组 二维数组是怎么样的呢?实际上,在Java中我们只有一维数组。...它们位于内存中什么地方? 在Java中,数组也是对象,所以一个对象在内存中的结构适用于数组。 我们知道JVM运行时数据区包括堆,JVM栈,以及其他。...数组和对象是以相同的方式处理,所以读者也会明白数组在内存中是如何存储。

56610

【C 语言】结构 ( 结构类型定义 | 结构类型别名 | 声明结构变量的三种方法 | 栈内存中声明结构变量 | 定义隐式结构时声明变量 | 定义普通结构时声明变量 )

结构类型定义 ---- 使用 struct 关键字 , 定义普通的 结构类型 , 这是定义了 固定大小内存块别名 , 此时还没有给 结构 分配内存 ; 声明了 结构类型 变量后 , 才会在 栈内存...中为其分配内存 ; 使用 malloc 可以在 堆内存 中为其分配内存 ; /** * @brief The Student struct * 定义 结构 数据类型 , 这是定义了 固定大小内存块别名...* 此时还没有给 结构 分配内存 * 声明了 结构类型 变量后 , 才会在 栈内存中为其分配内存 * 使用 malloc 可以在堆内存中为其分配内存 */ struct Student {...) 声明变量 使用 结构类型 声明 结构变量 , 如果没有别名 , 必须使用 struct 结构类型 变量名 格式 , 声明结构变量 ; // 在栈内存中 定义 Student 结构...数据类型 , 这是定义了 固定大小内存块别名 * 此时还没有给 结构 分配内存 * 声明了 结构类型 变量后 , 才会在 栈内存中为其分配内存 * 使用 malloc 可以在堆内存中为其分配内存

1.9K10

结构成员在内存中的对齐方式

以下我会举两个结构的例子,分别画图的方式表达对齐的原则。 结构对齐的公式 记住以下这些规则,把结构往里面套就可以了。...结构对齐的原则就是牺牲空间的方式来减少时间的消耗,空间用完还可以复用,而时间过去了就再也不会回来了。...以 #pragma pack(x) 中 x 的大小和结构中占用空间最大的成员做比较,取小值为 n(外对齐依据) 以 n 值和结构每个成员比较,得出结果列表为 m[x] 根据每个成员的大小依次向内存中填充数据...,要求填充 成员的起始地址 减去 构起始地址 的差都可以整除 m[x] ,如不能整除则向后移动,直到可以整除再填充成员到内存(内对齐依据) 当全部成员填充完毕后所占用的字节若不能整除 n,则扩充内存到可以整除...案例一 我们来看一个简单的案例,#pragma pack(4) 为 4,结构中有 char、short、int 3个成员,其对齐的方式如下图表示: #include #pragma

15830

当包容结构遇见灵活的内存管理

欢迎来到我的代码世界~ 喜欢的小伙伴记得一键三连哦 ૮(˶ᵔ ᵕ ᵔ˶)ა 目录 一.结构 1.定义: 2.基本格式: 3 .结构的声明 4.结构的初始化 5.结构成员的访问 6.结构传参和结构传值...7.结构的自引用 8.匿名结构注意 9.内存对齐 10.位段 二.动态内存管理 1.为什么要有动态内存管理 2.malloc函数 3.free函数 4.calloc函数 5.relloc函数...结构成员的直接访问是通过点操作符(.)访问的 结构成员的间接访问:结构指针->成员名?...Node* next; }; 8.匿名结构注意 在使用匿名结构时,只能使用一次,且两个结构比较时已经失效 9.内存对齐 1.结构的第⼀个成员对⻬到和结构变量起始位置偏移量为0的地址处 2其他成员变量要对...但是编译器只为最⼤的成员分配⾜够的内存空间。联合体的特点是所有成员共⽤同⼀块内存空间。所以联合体也叫:共⽤

7210

jvm内存模型、jvm内存结构Java内存结构Java内存模型(JMM)、Java对象模型的区别(吐血研究整理)

jvm内存模型: JVM内存模型则是指JVM的内存分区。jvm内存模型 == jvm内存结构 == Java内存结构!!!汉语虽然博大精深,但是也经常会因为命名很雷同让人懵逼或者混淆不清。...jvm内存结构Java内存结构: 可以简单的理解成是虚拟机内存中分成了哪几部分,分别是干嘛的,然后再扩展讲讲关联的知识。...JMM并不像JVM内存结构(即java内存结构)一样是真实存在的,只是一个抽象的概念。JMM是和多线程相关的,描述了一组规则或规范,这个规范定义了一个线程对共享变量的写入时对另一个线程是可见的。...总之,JVM内存模型是真的内存结构管理,Java内存模型只是为了适应和解决多线程通信而产生的一种模型,通过一些关键字修饰就可以实现并发。...总结: jvm内存模型 == jvm内存结构 == Java内存结构,和Java虚拟机的运行时内存分区有关。 Java内存模型,和Java的并发编程有关。

87210

JVM内存结构Java内存模型和Java对象模型

比如本文我们要讨论的JVM内存结构Java内存模型和Java对象模型,这就是三个截然不同的概念,但是很多人容易弄混。...可以这样说,很多高级开发甚至都搞不不清楚JVM内存结构Java内存模型和Java对象模型这三者的概念及其间的区别。甚至我见过有些面试官自己也搞的不是太清楚。...Java内存模型 Java内存模型看上去和Java内存结构(JVM内存结构)差不多,很多人会误以为两者是一回事儿,这也就导致面试过程中经常答非所为。...这就是一个简单的Java对象的OOP-Klass模型,即Java对象模型。 总结 我们再来区分下JVM内存结构Java内存模型 以及 Java对象模型 三个概念。...JVM内存结构,和Java虚拟机的运行时区域有关。 Java内存模型,和Java的并发编程有关。 Java对象模型,和Java对象在虚拟机中的表现形式有关。

1.2K32

【C 语言】结构 ( 指针运算与指针内存操作 | 结构成员偏移量计算 )

文章目录 一、指针运算 与 指针内存操作 二、结构偏移量计算 一、指针运算 与 指针内存操作 ---- 指针变量算术运算 ( 指针可以是任意值 ) : 指针 是一个变量 , 如果对指针进行 算术 /...指针变量 , 必须是 合法的指针 ; char *p = NULL; // 下面的操作 涉及使用指针进行内存操作 , 编译通过 , 运行时报错 *p; free(p); 二、结构偏移量计算 ----...定义结构 : /** * @brief The Student struct * 定义 结构 数据类型 , 同时为该结构类型声明 别名 * 可以直接使用 别名 结构变量名 声明结构类型变量...Student; 求上述 Student 结构的 age 成员的偏移量 ; 将 0 地址 , 按照 Student 结构 内存 形式进行解释 , 即将 0 地址指针 强转为 Student * 类型...age 成员的地址 ; &(((Student *)0)->age) 将 age 成员的地址转为 int 类型 ; (int)&(((Student *)0)->age) 上述获取的就是 Student 结构

60220
领券