字节对齐

简介: 字节对齐 c++的字节对齐可以提高数据的存取效率。 1.默认情况   类中或结构体中各成员变量在存放的时候根据在结构中声明的顺序依次申请空间,其在结构体中相对于始址的偏移量必须为自身所占字节的整数倍,否则编译器会为上个成员变量追加内存分配。     类的嵌套定义、静态成员、函数等均不算进sizeof()里面。   同时VC为了确保结构体的大小为结构的字节边界数(即该结构体中占

字节对齐

c++的字节对齐可以提高数据的存取效率。

1.默认情况

  类中或结构体中各成员变量在存放的时候根据在结构中声明的顺序依次申请空间,其在结构体中相对于始址的偏移量必须为自身所占字节的整数倍,否则编译器会为上个成员变量追加内存分配。

    类的嵌套定义、静态成员、函数等均不算进sizeof()里面。

  同时VC为了确保结构体的大小为结构的字节边界数(即该结构体中占用最大空间的类型所占用的字节数)的倍数,所以在为最后一个成员变量申请空间后,还会根据需要自动填充空缺的字节。

2.#pragma pack(n)

  VC 中提供了#pragma pack(n)来设定变量以n字节对齐方式。n字节对齐就是说变量存放的起始地址的偏移量有两种情况:
  1.如果n大于等于该变量所占用的字节数,那么偏移量必须满足默认的对齐方式;
  2.如果n小于该变量的类型所占用的字节数,那么偏移量为n的倍数,不用满足默认的对齐方式。
  结构的总大小也遵循上述规则。

 

     

#include <iostream>
//# pragma pack (4)
using namespace std;
class A{
	int a;//4
	short b;//2
	int c;//2+4
	char d;//1
};//4+2+6+1=13 结构体后续补上3,总的为16 
class B{
	int a;//4 
	short b;//2
	char c;//1
	int d;//1+4
};//4+2+1+5=12  结构体已对齐 
//无论A还是B,pack 中的4 不小于任何一个成员变量的sizeof,故相当于没写 
int main(int argc, char *argv[])
{
	cout<<sizeof(A)<<sizeof(B);//16 12
	return 0;
}
#include<iostream>
//#pragma pack(2)//若采用2字节对齐,输出22
class A
{
	int i;//4
	union U
	{
		char buff[13];
		int i;
	}u;//13
	void foo() {    }
	typedef char* (*f)(void*);
	enum{red, green, blue} color;//3+4
}a;//4+16+4=24

int main(){
	std::cout<<sizeof(A);//输出24 
	return 0;
}
 
Windows 中的 WORD 2字节,DWORD 4字节。

目录
打赏
0
0
0
0
14
分享
相关文章
指针详解(3)
指针详解(3)
|
5月前
|
指针初步讲解(下)
指针初步讲解(下)
50 2
【C】指针详解(一篇文章带你玩转指针)
很多人学习C语言都在为指针头疼,今天一篇文章带你玩转指针。
|
10月前
|
C指针详解
C指针详解。
41 0
C指针(详解)
C指针(详解)
205 0
指针(一)
系统给内存的每一个字节,分配一个编号,这个编号就是内存地址
指针(一)
指针(二)
指针变量指向的类型:将变量名和离他最近的一个一起拖黑 剩下啥类型 指针变量指向的类型就是啥类型
指针(二)
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等