
结构体内存布局`alignof`
发布日期:2021-05-08 04:53:58
浏览次数:20
分类:精选文章
本文共 1200 字,大约阅读时间需要 4 分钟。
首先看看下面这个程序输出
#include#include #include typedef uint32_t MYSIZE;struct Node{ char *Data;// 1 --- 指针变量,如果在64位操作系统上,占用8byte struct Node *Next;// 2 --- 同样是指针变量,如果在64位操作系统上,占用8byte MYSIZE Size;// 3 --- uint32_t 32位uint占用4byte MYSIZE Pos;// 4 --- uint32_t 32位uint占用4byte};int main() { printf("alignof struct Node: %d\n", alignof(struct Node)); printf("struct sizeof Node: %d\n", sizeof(struct Node)); return 0;}
output:
alignof struct Node: 8struct sizeof Node: 24
计算一个struct大小对依据就是 alignof 的大小。一句话就是结构体的内存布局根据 alignof 的长度进行对齐布局的。为了便于说明,将上面程序中结构体Node中的4个变量编号:
- Data
- Next
- Size
- Pos
结下来使用编号来表示内存布局:
1 1 1 1 1 1 1 1 // 长度82 2 2 2 2 2 2 2 // 长度83 3 3 3 4 4 4 4 // 长度4 加 长度4
这里是以长度8对齐的,即alignof 为8,struct node 的总长度为24,合理解释来程序输出。
下面调整一下结构体,将3提到2前面,看看程序布局会发生什么变化。
struct Node{ char *Data;// 1 --- 指针变量,如果在64位操作系统上,占用8byte MYSIZE Size;// 3 --- uint32_t 32位uint占用4byte struct Node *Next;// 2 --- 同样是指针变量,如果在64位操作系统上,占用8byte MYSIZE Pos;// 4 --- uint32_t 32位uint占用4byte};
程序输出output:
alignof struct Node: 8struct sizeof Node: 32
为什么结构体的大小会变大为32呢?
看看下面的结构布局:1 1 1 1 1 1 1 13 3 3 32 2 2 2 2 2 2 24 4 4 4
按照alignof=8进行对齐布局,只能是这么一个情况。所以,结构体大小就变成来32。
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2025年03月29日 22时11分17秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
ASP.NET Core 实战:Linux 小白的 .NET Core 部署之路
2021-05-09
【nodejs原理&源码杂记(8)】Timer模块与基于二叉堆的定时器
2021-05-09
如何查看jsplumb.js的API文档(YUIdoc的基本使用)
2021-05-09
大前端的自动化工厂(1)——Yeoman
2021-05-09
数据仓库建模方法论
2021-05-09
数据仓库之拉链表
2021-05-09
虚拟机搭建hadoop环境
2021-05-09
DataStax Bulk Loader教程(四)
2021-05-09
物联网、5G世界与大数据管理
2021-05-09
Cassandra与Kubernetes
2021-05-09
.NET应用框架架构设计实践 - 概述
2021-05-09
Rust 内置 trait :PartialEq 和 Eq
2021-05-09
Hibernate(十四)抓取策略
2021-05-09
Mybatis入门之增删改查
2021-05-09
[菜鸟的设计模式之旅]观察者模式
2021-05-09
Spring-继承JdbcDaoSupport类后简化配置文件内容
2021-05-09
Java基础IO流(一)
2021-05-09
Hibernate入门(四)---------一级缓存
2021-05-09
MySQL事务(学习笔记)
2021-05-09