栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++内存对齐之结构体大小计算方式

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++内存对齐之结构体大小计算方式

计算机取数据是固定长度,可以提高效率。C++中的变量存放遵循对齐原则。

什么叫字节对齐?

假如一个char类型变量按四字节对齐方式储存,那它就存储在一个四字节单元中,仅占据首字节地址,其它字节空闲。再存储下一个数据变量时,不会占用上个单元的空闲字节,只会开辟一个新的四字节单元。字节对齐数一般都是2的倍数。

结构体大小的计算方法

整体对齐:以结构体内最大基本数据类型的字节数为模板,成员按顺序填充。

局部对齐:填充时按前面已存储的最大数据类型字节进行对齐。

结尾补齐:补齐最大字节单元。

struct Node {
	char c;
	int h;
	double s;
	void* p;
	char str[10];
}

该结构体的最大基本数据类型为double(8字节),所以以8字节为模板,结构体数据按顺序存储,首先为一个字节的char,再填充int的时候就为四字节对齐,两个数据变量共占8字节,依次类推,在最后不足8字节补齐。

所以该结构体的大小为32字节。

不同类型数据定义顺序不一样,也会导致结构体大小发生改变。将double和int的定义顺序交换,结构体大小就变成40字节,因为按默认的对齐方式char c独占8字节,str占了16字节。

设置字节对齐

#pragma pack(2)
struct Node {
	char c;
	
	int h;
	double s;
	int* p;
	char str[10];
};

结构体大小为28字节,#pragma pack(2)对齐以2字节为模板。#pragma pack()则是系统默认方式对齐。

如有错误,欢迎大佬指正。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/957960.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号