c++结构体内存对齐

结构体内存对齐

试试运行下面的例子

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

using namespace std;

struct A{
    char c;
    int i;
};


struct B{
    char c; 
    int i;  
    double d; 
};


struct C{
    char c;
    int i;
    double d;
    char c1;
};

int main(){
    printf("sizeof(A): %d\n", sizeof(struct A));
    printf("sizeof(B): %d\n", sizeof(struct B));
    printf("sizeof(C): %d\n", sizeof(struct C));

    system("pause");
    return 0;
}


以上输出的结果并非实际成员占用的字节数,这就是结构体的内存对齐!

结构体内存对齐原因

1.移植原因

"不是所有的硬件平台都能访问任意地址上的任意数据;某些硬件平台只能在某些特定地址处取某些特定的数据,否则就会抛出硬件异常"。也就是说在计算机在内存读取数据时,只能在规定的地址处读数据,而不是内存中任意地址都是可以读取的。

  1. 效率原因

正是由于只能在特定的地址处读取数据,所以在访问一些数据时,对于访问未对齐的内存,处理器需要进行两次访问;而对于对齐的内存,只需要访问一次就可以。 其实这是一种以空间换时间的做法,但这种做法是值得的。

结构体对齐规则

1.第一个成员在结构体变量偏移量为0 的地址处,也就是第一个成员必须从头开始。

2.其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。对齐数为编译器默认的一个 对齐数与该成员大小中的较小值。vs中默认值是8 Linux默认值为4(可以通过#pragma pack (N) 修改,使用#pragma pack(show) 可以查看对齐值),但修改时N的取 值只能设置成1, 2,4,8,16.

3.结构体总大小为最大对齐数的整数倍。(每个成员变量都有自己的对齐数)

4.如果嵌套结构体,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是 所有最大对齐数(包含嵌套结构体的对齐数)的整数倍

结构体对齐示例


相关推荐
我爱工作&工作love我8 分钟前
【深基18.例3】查找文献-图的储存与遍历
算法·深度优先·图论
superior tigre10 分钟前
C++学习:六个月从基础到就业——面向对象编程:重载运算符(下)
c++·学习
心软且酷丶22 分钟前
leetcode:2899. 上一个遍历的整数(python3解法)
python·算法·leetcode
啾啾Fun23 分钟前
数据结构与算法学习导航
学习·算法
m0_zj27 分钟前
41.[前端开发-JavaScript高级]Day06-原型关系图-ES6类的使用-ES6转ES5
开发语言·javascript·es6
海棠蚀omo30 分钟前
C++笔记-list
开发语言·c++·笔记
AI技术控33 分钟前
计算机视觉算法实战——基于YOLOv8的农田智能虫情测报灯害虫种类识别系统开发指南
人工智能·深度学习·算法·yolo·计算机视觉
烟雨柳成烟36 分钟前
C++学习Day0:c++简介
开发语言·c++·qt·学习
XINVRY-FPGA1 小时前
XC6SLX100T-2FGG484I 赛灵思 XilinxFPGA Spartan-6
c++·人工智能·嵌入式硬件·阿里云·ai·fpga开发·fpga
SMiLe1 小时前
CMake学习笔记
c++