C语言之结构体对齐

这篇具有很好参考价值的文章主要介绍了C语言之结构体对齐。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


本文是根据项目调试经验,回顾基本知识进行的记录。如果整理的不错,记得赞一下喔,谢谢。

一、介绍

1.1 什么是C语言结构体:

结构体是C语言中一种复合数据类型,用于组合不同的数据类型。
结构体可以包含不同类型的成员变量,例如整数、浮点数、字符、指针等。
结构体主要用于描述和表示复杂的数据结构。

1.2 为什么需要使用结构体:

结构体能够将不同类型的数据组合在一起,方便数据的统一处理和管理。
结构体能够清晰地表示数据的组成和关系,提高代码的可读性和可维护性。
结构体在面向对象的编程中也有重要的应用。

1.3 pragma pack的含义和作用:

pragma pack是一种编译器指令,用于控制结构体的内存布局。
pragma pack可以指定结构体成员的对齐方式,从而优化内存使用和提高访问效率。
pragma pack可以减少内存的浪费和访问的开销,提高程序的性能。

1.4 offsetof的含义和作用:

offsetof是一个宏定义,用于计算结构体成员在结构体中的偏移量。
offsetof通过结构体的首地址和成员的地址来计算成员的偏移量。
offsetof在程序中常常用于访问结构体的成员,尤其是对于跨平台的编程和网络编程等场景。

二、结构体基础知识

2.1 结构体的定义和声明:

结构体的定义使用struct关键字,后面跟着成员变量的声明。
结构体的声明可以直接定义变量,也可以先声明结构体类型,再定义变量。

2.2 结构体的成员访问:

通过点号(.)来访问结构体的成员变量。
可以使用箭头(->)来通过指针访问结构体的成员变量。

2.3 结构体的初始化和赋值:

可以直接对结构体进行初始化,也可以通过成员逐个赋值。
可以使用赋值运算符(=)对结构体进行赋值。

2.4 结构体的内存布局:

默认情况下,C语言的编译器会按照一定的规则对结构体进行内存布局。
内存布局包括成员变量的排列顺序、对齐方式、偏移量等。

三、pragma pack的使用

3.1 pragma pack的基本语法:

#pragma pack(push, n) // 将当前代码块的内存布局设置为n字节对齐
#pragma pack(pop) // 恢复上一个代码块的内存布局

3.2 pragma pack的使用示例:

#pragma pack(push, 1)   // 将内存布局设置为1字节对齐
struct MyStruct1 {
    char c;              // 占用1字节
    int i;               // 占用4字节
};
#pragma pack(pop)      // 恢复上一个代码块的内存布局

3.3 pragma pack对结构体内存布局的影响:

pragma pack可以改变编译器默认的内存布局规则,指定不同的对齐方式。
pragma pack可以减少内存的浪费和访问的开销,提高程序的性能。

3.4 pragma pack的注意事项和限制:

pragma pack可能会影响代码的可移植性,因为不同的编译器可能有不同的对齐规则和限制。
pragma pack可能会增加代码的复杂度,需要谨慎使用。

四、offsetof的使用

4.1 offsetof的定义和语法:

#include <stddef.h> // 引入offsetof的定义和宏定义
offsetof(type, member) // 计算成员在类型中的偏移量,type是结构体类型,member是成员变量名

4.2 offsetof的使用示例:

#include <stddef.h>   // 引入offsetof的定义和宏定义
struct MyStruct {
    int a;              // 占用4字节
    char b;             // 占用1字节
    int c;              // 占用4字节
};

int main() {
    printf("%zu\n", offsetof(struct MyStruct, b));   // 输出1,表示成员b在MyStruct中的偏移量为1字节(从结构体的首地址开始计算)
    return 0;
}

4.3 offsetof的计算原理和过程:

offsetof通过结构体的首地址和成员的地址来计算成员的偏移量。具体实现方式是编译器在编译时计算的。文章来源地址https://www.toymoban.com/news/detail-641746.html

到了这里,关于C语言之结构体对齐的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【HarmonyOS北向开发】-04 ArkTS开发语言-ArkTS基础知识

     飞书原文档:Docs

    2024年02月11日
    浏览(53)
  • 嵌入式硬件基础知识——1

    目录 SOC、MCU、MPU、CPU SPI STM32的时钟系统 can是什么 串口和并口 传感器输出引脚高阻抗好还是低阻抗好? iic 运算放大器特点 MOS管和三极管 同步电路和异步电路         SOC 片上系统  手机的核心芯片         MCU 微控系统  单片机         MPU 嵌入式微处理器    

    2024年02月05日
    浏览(48)
  • 嵌入式基础知识-总线带宽

    带宽,最容易想到的是上网用的网络带宽,在嵌入式软件开发中,也会用到带宽,这个带宽的含义就不一样了,区别是什么?本篇就来介绍一下,并通过一些例子来进行带宽的计算。 先来简单看下不同领域的带宽: 显示器中的带宽,单位是MHz,是一个频率的概念 通讯领域的

    2024年02月13日
    浏览(43)
  • 嵌入式基础知识-DMA

    本篇来介绍DMA的一些基础知识。 DMA(Direct Memory Access),中文名为直接内存访问,它是一些计算机总线架构提供的功能,能使数据从附加设备(如磁盘驱动器)直接发送到计算机主板的内存上。对应嵌入式处理器来说,DMA可以提供外设和存储器之间,或存储器与存储器之间的高

    2024年02月09日
    浏览(39)
  • 嵌入式基础知识大杂烩

    u-boot(或称为Das U-Boot)是一种广泛应用于嵌入式系统的开源引导加载程序。它通常存放在嵌入式系统的非易失性存储器中,具体位置可以根据具体的嵌入式系统架构和设计来确定。 以下是几种常见的u-boot存放位置: 1. Flash存储器: 类似于 单片机 的情况,u-boot可以被烧写到

    2024年02月09日
    浏览(47)
  • 嵌入式入门基础知识有哪些?

    嵌入式系统 是指在特定应用领域内为满足特定要求而设计的计算机系统,通常被嵌入到设备中,具有实时性、可靠性、低功耗等特点。嵌入式系统应用广泛,例如:智能家居、智能手表、汽车控制系统、医疗设备等。 在本篇博客中,我们将讨论嵌入式入门基础知识,包括嵌

    2024年02月15日
    浏览(49)
  • 嵌入式系统入门基础知识分析(一)

      目录 ​编辑 一、什么是嵌入式 二、嵌入式系统的组成 三、实时系统 四、实时系统的调度 五、嵌入式微处理器体系结构 六、逻辑电路基础 七、总线电路及信号驱动 八、电平转换电路 九、嵌入式系统中信息表示与运算基础 十、差错控制编码 十一、嵌入式系统的度量项目

    2024年02月05日
    浏览(62)
  • 第二章 嵌入式系统硬件基础知识

    (1)信号特性 用 “ 逻辑真 ” “ 1 ” 或 “ 确定 ”来表示 高电平 用 “ 逻辑假 ” “ 0 ” 或 “ 不确定 ”来表示 低电平 1和0称为 互补信号 (2)信号转换 1、数字集成电路的分类         按照开关元件的不同,数字集成电路分为两大类:一类是 双极型集成电路

    2024年01月21日
    浏览(66)
  • 嵌入式学习笔记——STM32硬件基础知识

    上一篇中我们重点是讲了一下怎么搭建开发环境以及怎么下载烧录的过程,这都是解决的电脑端的开发环境问题,还没有到实际的开发板上,我们的单片机是都是焊接在开发板上的,PCB上有着它所需的工作电路。并不是直接给供电电压就可以让其工作的,本文主要是简介一下

    2024年01月22日
    浏览(68)
  • 嵌入式学习stm32基础知识(期末复习)

    1. 计算机的体系架构 冯诺依曼架构 ​ 在完整的计算机系统中,包含五个部分,储存器,运算器,控制器输入设备和输出设备。 改进的冯诺依曼架构 改进型架构的各模块的高速数据交换中心利用储存器这个大容量,极大的提高了效率。 哈佛架构 ​ 哈佛结构数据空间和地址

    2024年02月07日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包