1.c语言中的类型

1)内置类型——char,short,int,float,double;

2)用户自定义类型(UDT)——struct结构体,union联合体,enum枚举类型

2.内存对齐

2.1概念

1)内存对齐就是编译器为程序中的每个“数据单元”安排在适当的位置上

2)对于内存对齐问题,主要存在于struct和union等复合结构在内存中的分布情况

2.2规则

1)对于结构的各个成员,第一个成员位于偏移为0的位置,以后的每个数据成员的偏移量 = min ( #pragma pack(n) 指定的n值, 这个数据成员的字节数 ) 的倍数,#pragma pack(n)可以设置, Windows中默认为8,Linux中默认为4;

2)结构或联合体本身也要进行对齐,其字节大小=min( #pragram pack(n) ,  长度最长的数据成员 )的倍数

  1. struct MyStruct //MyStruct的内存分布:*xxx | **** | ** (*代表使用,x代表未使用)
  2. {
  3. char a; //偏移量为0
  4. int b; //偏移量为4
  5. short c; //偏移量为8
  6. };
  7. //windows下MyStruct的字节大小为:1+4+2=7,变成4的倍数:12

2.3为什么要内存对齐

1)平台原因:不是所有的硬件平台都能访问任意地址上的任意数据,某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常

2)性能提升:经过内存对齐之后,CPU的内存访问速度大大提升,原因:

  • 内存读取粒度:cpu把内存当成是一块一块的,块的大小可以是2,4,8,16 个字节,因此CPU在读取内存的时候是一块一块进行读取的,块的大小称为(memory granularity)内存读取粒度
  • 假设CPU要读取一个4字节大小的数据到寄存器中(假设此CPU内存读取粒度是4),分两种情况讨论:
  1.  数据从0字节开始:直接将0~3四个字节完全读取到寄存器,完成,这时候没有任何影响
  2.  数据从1字节开始:首先先将0~3的4个字节读到寄存器,并再次读取4~7字节的数据进寄存器,接着把0、5、6、7的数据剔除,最后合并1,2,3,4字节的数据进寄存器,这些额外操作大大降低了CPU的性能

2.union联合体

2.1概念

1)联合体union类似于结构体struct(struct概念:不同类型数据的集合体)

2)联合体用同一段内存单元存放不同数据类型的成员,在使用时,一次只能使用其中的一个成员

3)它的所有成员相对于基地址的偏移量都为0

4)union的大小取决于它所有的成员中,占用空间最大的一个成员的大小,并且union的大小要能被其他成员的大小所整除

  1. union U1
  2. {
  3. char s[];
  4. };
  5.  
  6. union U2 //s占11字节,n占4字节,d占8字节,所以至少需11字节的空间,但11不能被8整除,所以补充字节到16
  7. {
  8. int n;
  9. char s[];
  10. double d;
  11. };
  12.  
  13. int main()
  14. {
  15. cout << sizeof(U1) << endl; //输出:11
  16. cout << sizeof(U2) << endl; //输出:16
  17.  
  18. return ;
  19. }

2.2应用

1)当多个类型的变量要占用同一片内存时,可以使用联合体:检测当前机器是采用大端还是小端

2)当多个事物只取其一时(“n选1”),可以使用联合体:

试题:假设网络节点A和网络节点B中的通信协议涉及四类报文,报文格式为“报文类型字段+报文内容的结构体”,四个报文内容的结构体类型分别为Struct1~ Struct4,请编写程序以最简单的方式组织一个统一的报文数据结构。
分析:
报文的格式为“报文类型+报文内容的结构体”,在真实的通信中,每次只能发四类报文中的一种,我们可以将四类报文的结构体组织为一个union(共享一段内存,但每次有效的只是一种),然后和报文类型字段统一组织成一个报文数据结构。
  1. //报文内容联合体
  2. union PacketContent
  3. {
  4. Struct1 pkt1;
  5. Struct2 pkt2;
  6. Struct3 pkt1;
  7. Struct4 pkt2;
  8. };
  9.  
  10. //统一的报文结构
  11. struct Packet
  12. {
  13. unsigned char pktType;//报文类型
  14. PacketContent pktContent;//报文内容
  15. };

4.enum枚举类型

4.1概念

1)枚举可以让一些数字符号化

2)c语言中枚举常量是按照int来处理

3)c语言的枚举变量可以++,c++的枚举变量不可以

4.2定义的格式

  1. enum 枚举类型名 {枚举常量0=int常量(可无,默认值为0),枚举常量1=int常量(可无,默认值为1),枚举常量2,枚举常量3=int常量(可无,默认值为3),…};
  1. enum Color { red, blue };
  2. enum Color cfq;
  3. cfq = red;
  4. ++cfq; //c语言的枚举变量可以++
  1. enum Color { red, orange, blue };
  2. Color hehe;
  3. hehe = red;
  4. ++hehe; //错误,c++的枚举变量不可以++

结构体struct、联合体union、枚举类型enum的更多相关文章

  1. Android For JNI(五)——C语言多级指针,结构体,联合体,枚举,自定义类型

    Android For JNI(五)--C语言多级指针,结构体,联合体,枚举,自定义类型 我们的C已经渐渐的步入正轨了,基础过去之后,就是我们的NDK和JNI实战了 一.多级指针 指针的概念我们在前面 ...

  2. C++-结构体,联合体,枚举,的区别

    结构体: struct  NUM { int number; }a; 结构体是声明只是一个模型,没有分配内存空间.当进行定义结构体变量后才分配内存空间 联合体: union  data { int a ...

  3. android109 结构体,联合体,枚举,自定义

    #include <stdio.h> #include <stdlib.h> void study(){ printf("吃饭睡觉打李志\n"); } // ...

  4. C#中的元组(Tuple)和结构体(struct)

    在正常的函数调用中,一个函数只能返回一个类型的值,但在某些特殊情况下,我们可能需要一个方法返回多个类型的值,除了通过ref,out或者泛型集合可以实现这种需求外,今天,讲一下元组和结构体在这一方面的应 ...

  5. C和C++中结构体(struct)、联合体(union)、枚举(enum)的区别

    C++对C语言的结构.联合.枚举 这3种数据类型进行了扩展. 1.C++定义的结构名.联合名.枚举名 都是 类型名,可以直接用于变量的声明或定义.即在C++中定义变量时不必在结构名.联合名.枚举名 前 ...

  6. 【UE4 C++ 基础知识】<4> 枚举 Enum、结构体 Struct

    枚举 UENUM宏搭配BlueprintType可以将枚举暴露给蓝图,不使用的话,仅能在C++使用 //定义一个原生enum class enum class EMyType { Type1, Typ ...

  7. Swift中元组(Tuples),结构体(Struct),枚举(Enums)之间的区别

    Swift有许多种存储数据方式,你可以用枚举(enums),元组(tuples),结构体(structs),类(classes),在这篇文章中我们将比较枚举.元组.结构体之间区别,首先从最简单的开始- ...

  8. C语言进阶——结构体,联合,枚举

    ----------------------------------------------------------我是一条划分线----------------------------------- ...

  9. 【 转】 C/C++结构体和联合体的区别

    联合体用途:使几个不同类型的变量共占一段内存(相互覆盖) 结构体是一种构造数据类型用途:把不同类型的数据组合成一个整体-------自定义数据类型 总结: 声明一个联合体: union abc { i ...

随机推荐

  1. REST framwork之解析器

    一 我们首先要知道解析器是什么以及他的功能: REST framework 包含许多内置的解析器类,允许接受各种媒体类型(media types)的请求.还支持自定义解析器,这使你可以灵活地设计 AP ...

  2. 性能测试day03_前端分析调优思路

    刚刚看到有人支持我写的博客,表示还是比较感动的,发现热心的用户在我的博客留言说“一个系统每天有200万在线用户,问我怎么设计性能场景?”,其实这个问题呢就属于业务没理清,这个问题就像我问你,一个城市一 ...

  3. java.io.UnsupportedEncodingException

    启动项目抛错: java.io.UnsupportedEncodingException: 1 at java.lang.StringCoding.decode(StringCoding.java:1 ...

  4. leetcode136

    public class Solution { public int SingleNumber(int[] nums) { Dictionary<int, int> dic = new D ...

  5. PHP/TP5 接口设计中异常处理

    PHP提供 Exception 类来处理异常 new Exception('错误信息(默认为空)','错误代码(默认0)','异常链中前一个异常') 然后可以通过 e -> getMessage ...

  6. JEECG-Swagger UI的使用说明

    一.代码生成 (此步骤为代码生成器的使用,如不清楚请查阅相关文档视频) 1.进入菜单[在线开发]-->[Online表单开发],选中一张单表/主表,点击代码生成按钮. 2.弹出页面中填写代码生成 ...

  7. 如何配置IIS使其支持APK文件的下载

    在管理工具里打开Internet 信息服务(IIS)管理器.然后选择需要配置的网站. 右侧的界面中会显示该网站的所有功能配置,我们选择并点击进入“MIME类型” 在左侧的操作区选择点击“添加”MIME ...

  8. java后台解析前端传来的json

    @RequestMapping(value = {"save"}) @ResponseBody public Result save(TBaseInterventionPlan m ...

  9. BASIC GIT WORKFLOW

    BASIC GIT WORKFLOW Generalizations You have now been introduced to the fundamental Git workflow. You ...

  10. 443. String Compression

    原题: 443. String Compression 解题: 看到题目就想到用map计数,然后将计数的位数计算处理,这里的解法并不满足题目的额外O(1)的要求,并且只是返回了结果array的长度,并 ...