C语言深度理解之——结构体内存对齐

前言:

在C语言中,结构体(struct)是一种用户自定义的数据类型,可以包含不同类型的数据成员。在定义结构体时,编译器会根据平台的要求对结构体的内存进行对齐,以提高内存访问的效率。结构体内存对齐可以避免因为数据成员的排列顺序不同而导致的内存浪费和性能问题。

目录

前言:

[1. 结构体内存对齐原则](#1. 结构体内存对齐原则)

[2. 默认对齐数](#2. 默认对齐数)

[3. 修改默认对齐数](#3. 修改默认对齐数)

[4. 代码示例](#4. 代码示例)


1. 结构体内存对齐原则

在C语言中,结构体内存对齐的原则可以总结如下:

  • 结构体的起始地址必须是最宽基本类型成员的整数倍。
  • 结构体的每个成员相对于结构体的起始地址的偏移量必须是该成员大小的整数倍。
  • 结构体的总大小必须是最宽基本类型成员大小的整数倍。

2. 默认对齐数

在C语言中,默认的对齐数通常是编译器相关的,一般情况下默认对齐数是当前平台最宽基本类型的大小(例如在32位系统上是4字节,在64位系统上是8字节)。

3. 修改默认对齐数

在C语言中,可以使用**#pragma pack(n)指令来修改默认的对齐数,其中n表示要设置的对齐数。这个指令告诉编译器按照n**字节对齐数据成员,而不是按照默认的对齐数。

4. 代码示例

下面是一个简单的代码示例,演示了结构体内存对齐和修改默认对齐数的情况:

cpp 复制代码
#include <stdio.h>

// 默认对齐数
#pragma pack(1)

// 定义一个结构体
struct Student {
    char name[20];
    int age;
    float score;
};

int main() {
    printf("Size of struct Student: %lu bytes\\n", sizeof(struct Student));

    // 恢复默认对齐数
    #pragma pack()

    // 修改对齐数为4
    #pragma pack(4)

    struct Student s;

    printf("Size of struct Student with pack(4): %lu bytes\\n", sizeof(struct Student));

    return 0;
}

在上面的代码中,我们首先定义了一个结构体**Student,包含一个字符数组、一个整型和一个浮点数。然后通过sizeof运算符可以获取结构体的大小。在main函数中,我们演示了如何使用#pragma** pack指令来修改默认对齐数,以及如何恢复默认对齐数。

通过运行上述代码,您可以看到在修改对齐数为4时,结构体**Student**的大小会发生变化。这个例子展示了结构体内存对齐和修改默认对齐数的效果。


这篇文章讲解的就是C语言底层的东西,由于缺少图片的原因,这篇文章并不容易理解,有不懂的地方欢迎私信我或者在评论区指出,我将尽我所能进行帮助。

感谢观看,还请各位大佬留下一个小小的赞!!!

相关推荐
嵌入式学习菌5 分钟前
Modbus‑RTU 数据类型分析
开发语言·单片机·bug
matlab代码1 小时前
基于matlab数字图像处理的指纹识别系统【源码68期】
开发语言·matlab
matlab代码1 小时前
基于matlab的水果识别系统(苹果香蕉菠萝梨桃子)【源码65期】
开发语言·matlab
wuyk5552 小时前
从零吃透 MQTT 通信|第 8 章 FreeRTOS 多任务架构下 MQTT 工程架构,任务拆分、队列解耦、临界区保护
c语言·开发语言·stm32·学习·架构
weixin199701080162 小时前
[特殊字符]《跨境二手ERP对接Back Market:标准化API + 7~10工作日技术合规审核实录》(附Python源码)
开发语言·python·pandas
尘客-追梦2 小时前
Day 01:插件化之前,先看清 ABI 这堵墙
开发语言·c++·qt
持敬chijing2 小时前
Python-数据类型-列表
开发语言·python·青少年编程
xx~t3 小时前
嵌入式——51单片机1
linux·c语言·单片机·嵌入式硬件·51单片机
写后端的胖头鱼4 小时前
【高频面试题】Java 基础类型 + 包装类 + String 互相转换
java·开发语言
matlab代码4 小时前
基于matlab自助水果超市水果识别收费系统(GUI界面)【源码67期】
开发语言·matlab