C/C++内存对齐

注:以下在32位情况下讨论

先看现象,有这么几行代码

复制代码
#include<stdio.h>
struct test{
int a;
char b;
int c;
}typedef test;
int main(){
    int cnt=sizeof(test);
    printf("%d",cnt);
    return 0;
}

在我们不知道内存对齐前,很可能认为结构体大小是4+1+4=9,可实际结果是12

为什么会造成这样的现象?那就需要了解结构体的内存对齐了

结构体对齐规则

首先,先列出内存对齐的规则

  1. 结构体的首个成员始终从结构体变量的起始位置(偏移量为0)开始存储
  2. 其余成员变量需按其对齐数的整数倍地址进行存储
    • 对齐数取值为:编译器默认对齐数与该成员类型大小的较小值
    • Visual Studio 默认对齐数为8
    • Linux GCC 无默认对齐数,直接使用成员自身大小作为对齐数
  3. 结构体总大小必须是最大成员对齐数的整数倍
  4. 对于嵌套结构体的情况:
    • 嵌套的结构体按其成员中的最大对齐数进行对齐
    • 整个结构体的大小须为所有对齐数(包括嵌套结构体成员的对齐数)中最大值的整数倍

也就是说结构体内三个变量的地址并不是连续的,而是4+4+4=12,并未想当然的4+1+4=9

为什么需要内存对齐?

首先内存对齐的直接目的就是为了提高 cpu的效率,cpu一次性读取4个字节,当读取变量c时,会产生一个很dan疼的事,4+4+1变成这样读取,也就是 c的前三个字节和最后一个字节没有一起读取,所以要分两次读取导致cpu读取效率下降,也就是为什么需要内存对齐最直接最主要的原因。

练习

内存对齐结果如下

相关推荐
BlockChain88815 小时前
SpringBoot实战一:10分钟搭建企业级用户管理系统(20000字完整项目)
java·spring boot·后端
消失的旧时光-194315 小时前
第六课 · 6.1 从 JDBC 到 MyBatis:SQL 工程化是如何发生的?
java·sql·mybatis
梵尔纳多15 小时前
第一个 3D 图像
c++·图形渲染·opengl
Jaxson Lin15 小时前
Java编程进阶:线程基础与实现方式全解析
java·开发语言
夜喵YM15 小时前
基于 Spire.XLS.Free for Java 实现无水印 Excel 转 PDF
java·pdf·excel
xiaoqider15 小时前
C++继承
开发语言·c++
茶本无香15 小时前
设计模式之五—门面模式:简化复杂系统的统一接口
java·设计模式
阿华hhh15 小时前
day4(IMX6ULL)<定时器>
c语言·开发语言·单片机·嵌入式硬件
她说可以呀15 小时前
网络基础初识
java·网络·java-ee
YE1234567_15 小时前
从底层零拷贝到分布式架构:深度剖析现代 C++ 构建超大规模高性能 AI 插件引擎的实战之道
c++·分布式·架构