位段的内存分配

简介: 位段的内存分配

 对于位段,笔者在上篇文章中,已经详细的讲解了:位段的基础知识!!下面笔者来带领大家,学习一下:位段的内存分配!请大家紧跟步伐!!


在此之前,还需要各位老铁知道一下基础知识:


1.位段的成员可以是:int  ,unsigned int ,signed int ,或者,char (属于整型家族)类型!


2.位段的空间是按照需要以4个字节(int )或者1个字节(char)的方式开辟的


3.位段涉及很多不确定的因素,位段是不跨平台的,注意课移植的程序应该避免使用位段!


下面笔者简单通过一个位段代码解析来带领大家走进:位段的内存分配!!


#include <stdio.h>
struct s
{
  char a : 3;  //3指的是:a占3个比特位
  char b : 4;
  char c : 5;
  char d : 4;
};
int main()
{
  struct s s1 = { 0 };  //初始化为:0
  s1.a = 10;
  s1.b = 12;
  s1.c = 3;
  s1.d = 4;
  printf("%d\n", sizeof(struct s));   //3
  return 0;
}

上面的这个代码,虽然看似残缺,但是,笔者通过带领大家在调试中监视一下内存中的数据!可以看出来想要的内容!


代码的运行结果为:


0a2653c851af460fa595bd959398a8f1.png


char 类型,1个字节,8个比特位!


首先:对于数据,在内存中的存储,都是以:二进制形式存储的!!


对于a = 10  ,a的二进制形式为:000000000000000000000000000001010;但是,由于:char a : 3;  //3指的是:a占3个比特位  ,所以,a的二进制位在存储的时候,发生截断!仅保留3个比特位:010;    同理可得:b = 12;  仅保留4个比特位:1100,对于:   c = 3;  仅保留5个比特位:00011;    对于d = 4;仅保留4个比特位:0100;


2d65d23f6d4748949b924e4057485923.png


在代码的初始状态下:全部初始化为0:


此时:


6de278e6d6694ce5bb08e7e842b7e74b.png


将a, b, c ,d 的内容放进去后的内容为::


12c3b7f3f8814309a195c64f051d4445.png34e8d716411043c08c7ffba9fbba23de.png


在上面的结果中:比特位是从地位向高位(从左边向右边)使用的,当左边剩下的位数不够的时候,丢弃掉,再重新开辟一个字节(char类型),再在那个重新开辟的字节内部,从右边向左边使用!!


上面的代码,经过调试可见:笔者就不再带领大家进行VS的调试了!大家可以自行调试!!


另外,在内存中,调试后的结果会为: 62 03 04  原因是:在内存中的观看情况为:4个2进制位为一个16进制位!!


相关文章
|
7月前
|
存储 算法 大数据
内存原理 | 内存分配 | 内存对齐
内存原理 | 内存分配 | 内存对齐
|
程序员 编译器 C语言
动态内存函数,内存开辟,柔性数组(超详细)
动态内存函数,内存开辟,柔性数组(超详细)
79 0
|
4月前
|
存储 C语言
指针和动态内存分配
指针和动态内存分配
103 0
|
2月前
|
程序员 C语言
动态内存分配
【10月更文挑战第10天】
46 5
|
存储 编译器 C语言
关于内存对齐
关于内存对齐
133 0
|
C语言 C++
C++中的动态内存分配
C++中的动态内存分配
133 0
|
安全 C++
C++指针的内存分配与内存安全
C++指针的内存分配与内存安全
143 0
|
机器学习/深度学习 存储 编译器
一文轻松理解内存对齐(1)
一文轻松理解内存对齐
526 0
|
存储 编译器
一文轻松理解内存对齐(2)
一文轻松理解内存对齐
195 0
|
编译器
内存对齐
环境 32位操作系统 通过结构体的内存字节对齐了解操作系统的内存对齐 在32位操作系统中, CPU默认读和写数据是按照4字节的方式 在一个结构体中, 在编译的时候, 编译器会根据结构体中的成员变量使其内存对齐, 让他们都是符合让CPU一次读取的数据而不用再读取一次数据, 减少了读取的次数 下面通过案例讲解 1.
699 0