首页 > 其他分享 >C语言笔记 | Struct结构体

C语言笔记 | Struct结构体

时间:2022-10-29 13:33:08浏览次数:64  
标签:字节 Struct 笔记 C语言 char 对齐 结构 struct

结构体的概念

  • 由一系列具有相同类型或不同类型的数据构成的数据集合, 叫做结构

  • struct是一种复合数据类型, 结构类型

  • 在C语言中, 结构体(struct)是复合数据类型的一种, 同时也是一些元素的集合, 这些元素称为结构体的成员, 且这些成员可以为不同的类型, 成员一般用名字访问, 结构体可以被声明为变量/指针或数组等, 用以实现较复杂的数据结构

    • 在C语言中, 结构体不能包含函数
  • 在C++中, 考虑到C语言到C++语言过渡的连续性, 对结构体进行了扩展, C++的结构体可以包含函数, 在面向对象的程序设计中, 对象具有状态(属性)和行为, 状态保存在成员变量中, 行为通过成员方法(函数)来实现。C语言中的结构体只能描述一个对象的状态, 不能描述一个对象的行为, 与class不同的是, 结构体包含的函数默认为public, 而不是private

    • 在C++中, 结构体可以包含函数
    • 在C++中struct与class的区
      1. class中默认的成员访问权限是private的, 而struct中则是public的
      2. class继承默认是private继承, 而从struct继承默认是public继承

结构体的作用

  • 由于C语言内部程序比较简单, 研发人员通常使用结构体创造新的"属性", 其目的是简化运算
  • 结构体在函数中的作用不是简便, 最主要的作用就是封装, 封装的好处就是可以再次利用, 让使用者不必关心这个是什么, 只要根据定义使用就可以了

结构体大小与内存对齐

变量的字节对齐

一个变量占用n个字节, 则该变量的起始地址必须是n的整数倍

结构体字节对齐

  1. 实际对齐单位, 三者取最小
    1. CPU周期(位/8)
      • Windows VS默认8字节对齐
      • Linux 32位默认4字节对齐
      • Linux 64位默认8字节对齐
    2. 结构体最大成员(基本数据类型变量)
    3. 预编译指令#pragma pack(n)手动设置, n只能填1/2/4/8/16
  2. 除结构体的第一个成员外, 其它所有的成员的起始地址是实际对齐单位的整数倍

栗子

struct s {
    char a1;
    char a2;
    double b;
    int c;
};
  1. 先为a1和a2分配空间, 占用2字节, 与最大宽度对齐, 实际占用4字节
  2. 接下来为b分配空间, 最大宽度, 占用8字节
  3. 接下来为c分配空间, 占用4字节, 与最大宽度对齐, 实际占用8字节
  • 总占用24字节

总结

可以合理安排数据类型的先顺序以减少内存占用

占用8字节

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

占用12字节

struct S2 {
char c1;
int i;
char c2;
};
可以屏蔽掉变量默认的对齐方式, 自己来设定变量的对齐方式
#pragma pack(push)//保存对齐状态
#pragma pack(4)//设定为4字节对齐
struct test {
    char m1;
    double m4;
    int m3;
};
#pragma pack(pop)//恢复对齐状态

标签:字节,Struct,笔记,C语言,char,对齐,结构,struct
From: https://www.cnblogs.com/nancimua/p/16838562.html

相关文章

  • tracer ftrace笔记(11)—— DECLARE_HOOK 宏展开
    一、说明1.include/trace/hooks/vendor_hooks.h中定义#defineDECLARE_HOOKDECLARE_TRACE。2.hook模块的实现端(比如binder.c)和vendor使用端(比如要hookbinder.c......
  • 《MyBatis从入门到精通》读书笔记
    第一章mybatis入门第二章mybatisxml基本使用第三章mybatis注解基本使用不推荐的使用方法。优点:对于需求简单的系统,效率较高;缺点:SQL变化时,需要重新编译代码。四个......
  • php学习笔记二:第一个php程序 hello world!
    第一个php程序helloworld!前提条件:已经安装xampp和phpstorm xampp安装到了D:\xampp1打开phpstorm2新建项目保存项目到 D:\WorkTest\Php3添加index.php文件4......
  • php学习笔记一:开发环境选择
    1.开发工具使用 PhpStorm  对比过PhpStorm、zendstudio、eclipse和vs.php后还是选择了 PhpStorm,相关优缺点可以网上找找。2.部署工具使用xampp3.帮助文档​​http......
  • 0基础90分钟会用PS——GenJi笔记
    数码图像的相关基础概念1、位图和矢量图位图也叫点阵图像,位图使用也称像素的一格一格的小点来描述图像,图放大后我们可以看到像素点矢量图根据几何特性来绘制图形,用线......
  • 组合数学笔记
    引入Question1\(Question\quad1\)从\(n\)个不同元素中选\(r\)个元素,每个元素可以选多次,求方案数。分析:从\(1,2,3,...,n\)中选\(r\)个元素,不能重复,方案数显......
  • C/C++ struct结构体的三种使用方法
    #include<stdio.h>#include<string.h>#include<stdlib.h>#include<iostream>#include<conio.h>usingnamespacestd;structhero{charname[16];ch......
  • 基于C语言的通用型数据结构与容器库
    仓库地址:github:https://github.com/hellototoro/hlibcgitee:https://gitee.com/totorohello/hlibclist双向序列容器,用于将它们的元素保持为线性排列,并允许在序列的任何......
  • C语言“我的家谱”程序
    C语言“我的家谱”程序建立“我的家谱”问题家谱:又称族谱,是记载一个家族的世系繁衍及重要人物事迹的书。家谱中记录着父亲、母亲和孩子的姓名。请大家利用二叉树设计一个......
  • 私网部署DNS(BIND)笔记
    准备工作下载yuminstall-ybindbind-utils包含dig、nslookup等调试命令,非必须。yuminstall-ybind-utils防火墙firewall-cmd--permanent--add-port=53/udpfir......