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

【C++】内存字节对齐

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

【C++】内存字节对齐

内存字节对齐 1. 内存对齐规则
  • 对于结构体的各个成员,第一个成员位于偏移为0的位置,以后的每个数据成员的偏移量必须是MIN(字节对齐数,数据成员的长度)的倍数。
  • 在所有的数据成员完成各自对齐之后,结构体本身也要进行对齐,对齐将按照MIN(字节对齐数,长度最长的数据成员)进行。
// 设置n字节对齐,Windows默认是8,Linux默认是4
#pragma pack(n)
#include
using namespace std;

struct A {
	char a;
	int b;
	short c;
};

struct B {
	short c;
	char a;
	int b;
};

int main() {
	cout << sizeof(A) << endl;	// 12
	cout << sizeof(B) << endl;	// 8
	system("pause");
	return 0;
}

对于结构体A:

  • 结构体数据成员的对齐:short占2个字节,起始偏移为零。char占1个字节,min(8,1)=1,则偏移量为2,无需添加任何字节。int占4个字节,min(8,4)=4,所以偏移量是4的倍数,偏移量为4,应该在char后面加上1个字节。
  • 结构体本身的对齐:min(8,4)=4,总体应该是4的倍数,偏移量为8,无需添加任何字节。

对于结构体B:

  • 结构体数据成员的对齐:char占一个字节,起始偏移为零。int占四个字节,min(8,4)=4,则偏移量为4,应该在char后面加上三个字节,不存放任何东西。short占两个字节,min(8,2)=2,所以偏移量是2的倍数,偏移量为8,无需添加任何字节。
  • 结构体本身的对齐:min(8,4)=4,总体应该是4的倍数,还需要添加两个字节在最后面。
2. 需要对齐的原因
  • 平台原因:不是所有的硬件平台都能访问任意地址上的任意数据,某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
  • 硬件原因:CPU在读取内存的时候是一块一块进行读取的,块的大小称为内存读取粒度。访问未对齐的内存,数据先读高位,再读低位,处理器要访问两次内存;访问对齐的内存,处理器只要访问一次。为了提高处理器读取数据的效率,我们使用内存对齐。

参考:https://www.cnblogs.com/jijiji/p/4854581.html

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

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

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