iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言重难点之内存对齐和位段的示例分析
  • 121
分享到

C语言重难点之内存对齐和位段的示例分析

2023-06-15 00:06:35 121人浏览 独家记忆
摘要

这篇文章主要介绍了C语言重难点之内存对齐和位段的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。C语言是什么C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于

这篇文章主要介绍了C语言重难点之内存对齐和位段的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

C语言是什么

C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发,使用C语言可以以简易的方式编译、处理低级存储器。

一:结构体内存对齐

(1)为什么要存在内存对齐

平台原因(移植原因): 不是所有的硬件平台都能访问任意地址上的任意数据的;某些平台只能在某些地址处取得某些特定类型的数据,否则抛出硬件异常。
比如,当一个平台要取一个整型数据时只能在地址为4的倍数的位置取得,那么这时就需要内存对齐,否则无法访问到该整型数据。

性能原因:
数据结构(尤其是栈)应该尽可能的在自然边界上对齐。原因在于,为了访问未对齐内存,处理器需要作两次内存访问;而对齐的内存访问仅需一次。

核心思想就是:以空间换取时间

 举个例子:对于有32根地址总线的计算机来说,每次读取的单位是4个字节,假入定义了如下结构体:

struct s1{char c1;int i;char c2;}

由于c1占1个字节,i占4个字节,c2占1个字节,所以计算机在读取时候,会先读取c1和i的3个字节(共四个字节)、再读取i的最后一个字节和c2。因此计算器不但需要进行两次内存读取,并且还需要对i的数据进行拼接,无形中浪费了运行的时间。所以为了减少时间的浪费,就采用了内存对齐的方式。

(2)结构体对齐规则

  • 第一个成员在与结构体变量偏移量为0的地址处。(即结构体的首地址处,即对齐到0处)

  • 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。

  • 结构体的总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。

  • 如果嵌套了结构体,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

其中对齐数=编译器默认的一个对齐数与该成员大小的较小值。vs中默认为8。linux中默认值为4。

(3)结构体对齐演示

以下面的构体为例

struct S{double d;char c;int i;};

把结构体中每个成员变量的大小与编译器的默认对齐数进行比较,取小的作为该成员的对齐数

C语言重难点之内存对齐和位段的示例分析

从0位开始,画出这些成员的位置,注意对齐到自己的对齐数

C语言重难点之内存对齐和位段的示例分析

故为16个字节

(4)练习

//练习1struct S1{char c1;int i;char c2;};printf("%d\n", printf(struct S1);//12//练习2 struct S2 {    char c1;        char c2;        int i;  };  printf("%d\n", sizeof(struct S2));//8//练习3 struct S3 {    double d;        char c;        int i; }; printf("%d\n", sizeof(struct S3));//16//练习4-结构体嵌套问题 struct S4 {    char c1;        struct S3 s3;        double d; }; printf("%d\n", sizeof(struct S4));//32

二:位段

(1)什么是位段

“节省空间”这四个字可以直截了当的点名位段的作用。

在结构体设计中,我们一般用int来存年龄这样的数据,但是年龄这个东西再大也不会达到几百几千,也就是它的范围一般是1-100,反应在整形数据的内存上,使用的可能就是32个比特位中的个别几个,也就说剩余的很多比特位就是根本不会用到的,而如果明知道这样,还要不管三七二十一直接抛出一个整形,四个字节,32个比特位存储这么小的数,未免显的有点浪费了。所以正式鉴于此,位段就能合理的进行内存设计

(2)位段怎么写

位段的基本格式如下,和结构体十分相似,其内部的数据类型一般要求是一致的

C语言重难点之内存对齐和位段的示例分析

(3)位段结构体对齐怎么算

上述这个结构体所占空间大小为八个字节,在实际分配时,会一上来先分配四个字节,其中a,b,c占据2+5+10共17个比特位,剩余d需要30个比特位存储但是不够,所以再分配四个字节,拿出其中30个比特位存储。可以看出相比之前暴力的直接16个字节,现在的8个字节大大的节省了空间。

再比如下面位段

struct A{unsigned a : 19;unsigned b : 11;unsigned c : 4;unsigned d : 29;char index;};

其中a和b共占据4个字节,c和d占据八个字节,index对齐对齐1个字节,最终就是16

 位段的跨平台问题

  • int 位段被当成有符号数还是无符号数是不确定的。

  • 位段中最大位的数目不能确定。(16位机器最大16,32位机器最大32,写成27,在16位机

  • 器会出问题。

  • 位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。

  • 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是舍弃剩余的位还是利用,这是不确定的。

感谢你能够认真阅读完这篇文章,希望小编分享的“C语言重难点之内存对齐和位段的示例分析”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网其他教程频道,更多相关知识等着你来学习!

--结束END--

本文标题: C语言重难点之内存对齐和位段的示例分析

本文链接: https://www.lsjlt.com/news/276292.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言重难点之内存对齐和位段的示例分析
    这篇文章主要介绍了C语言重难点之内存对齐和位段的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。C语言是什么C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于...
    99+
    2023-06-15
  • C语言重难点之内存对齐和位段
    一:结构体内存对齐 (1)为什么要存在内存对齐 平台原因(移植原因): 不是所有的硬件平台都能访问任意地址上的任意数据的;某些平台只能在某些地址处取得某些特定类型的数据,否则抛出硬件...
    99+
    2024-04-02
  • C语言详细分析结构体的内存对齐
    目录一.结构体二.结构体内存对齐1.非嵌套结构体的大小2.含嵌套结构体的大小三.为什么要内存对齐1.平台原因(移植原因)2.性能原因一.结构体 结构体 (struct)是一种数据结构...
    99+
    2024-04-02
  • HTML和CSS重点难点的示例分析
    小编给大家分享一下HTML和CSS重点难点的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1.怎么让一个不定宽高的 p,...
    99+
    2024-04-02
  • C语言中结构体与内存对齐实例解析
    1.结构体类型 C语言中的2种类型:原生类型和自定义类型,结构体类型是一种自定义类型。 2.结构体使用时先定义结构体类型再用类型定义变量 -> 结构体定义时需要先定义结构体类型...
    99+
    2024-04-02
  • C语言详细分析结构体的内存对齐规则
    目录引例结构体内存对齐规则那么为什么要有内存对齐呢如何优化修改默认对齐数结构体的内存对齐是一个特别热门的知识点! 引例 #include<iostream> using ...
    99+
    2024-04-02
  • C语言中动态内存的示例分析
    这篇文章主要为大家展示了“C语言中动态内存的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C语言中动态内存的示例分析”这篇文章吧。1.关于动态内存的函数1.1 malloc和free函数...
    99+
    2023-06-29
  • C语言中动态内存管理的示例分析
    这篇文章主要介绍了C语言中动态内存管理的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。什么是动态内存分配我们都知道在C语言中,定义变量的时候,系统就会为这个变量分配内...
    99+
    2023-06-25
  • Java内存模型之重排序的示例分析
    小编给大家分享一下Java内存模型之重排序的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、数据依赖性如果两个操作访问同一个变量,而且这两个操作中有一个操作为写操作,此时这两个操作之间存在数据依赖性。数据依赖性分...
    99+
    2023-06-15
  • c语言中移位运算符的示例分析
    这篇文章主要介绍c语言中移位运算符的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!C语言是什么C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发,使用C语言可以以简易的方式编译、处理低级存储...
    99+
    2023-06-15
  • C语言中数据存储的示例分析
    这篇文章主要介绍了C语言中数据存储的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。(壹)大端小端藏端倪1.1  什么是大端小端大端(存储)模式,是指数据的低...
    99+
    2023-06-29
  • C语言中的动态内存分配实例分析
    本篇内容主要讲解“C语言中的动态内存分配实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言中的动态内存分配实例分析”吧!什么是动态内存分配我们目前已经知道的内存开辟的方式有:int&n...
    99+
    2023-07-02
  • C语言详细分析浮点数在内存中的储存
    目录浮点数的储存格式初步了解深入探究E不全为0或不全为1E全为0E全为1浮点数的储存格式 初步了解 首先让我们通过一段代码来认识一下浮点型和整型的区别: int main() { ...
    99+
    2024-04-02
  • C语言之预处理命令的示例分析
    这篇文章主要介绍C语言之预处理命令的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!c提供的预处理功能有:宏定义文件包含条件编译为了与其她c语句区分,命令经常以符号“#”开头。宏定义#define 标识符 字符...
    99+
    2023-06-14
  • C语言数据结构之绪论的示例分析
    小编给大家分享一下C语言数据结构之绪论的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!绪论什么是数据结构?不同于计算机操作培训,注意与程序设计的区别。Ex...
    99+
    2023-06-20
  • C语言中使用结构体计算内存占用的示例分析
    小编给大家分享一下C语言中使用结构体计算内存占用的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!    c语言中结构体使用是非常广泛的,但是结构体有一个问题,就是如果开头的字段属性是字符类型(c...
    99+
    2023-06-20
  • C++结构体字节对齐和共用体大小的示例分析
    这篇文章主要介绍了C++结构体字节对齐和共用体大小的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、结构体内存对齐结构体内存对齐在笔试和面试中经常被问到,所以做个总...
    99+
    2023-06-25
  • C语言位域和字节序的关系实例分析
    这篇“C语言位域和字节序的关系实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C语言位域和字节序的关系实例分析”文章吧...
    99+
    2023-06-08
  • c语言和php的简单对比,不同点分析!
    C语言和PHP是两种不同的编程语言,它们各自具有不同的特点和用途。本文将介绍C语言和PHP的不同点,以便读者更好地了解这两种编程语言。一、C语言和PHP的概述C语言是一种通用的高级计算机编程语言,被广泛用于操作系统、网络、数据库、科学计算等...
    99+
    2023-05-14
    php C语言
  • C语言入门基础之操作符的示例分析
    这篇文章给大家分享的是有关C语言入门基础之操作符的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。操作符首先第一部分操作符分类如上,具体不再用文字阐述。算术操作符首先算术操作符,有除号值得一讲,若想得浮点数...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作