字节对齐

简介: 字节对齐 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字节。

目录
相关文章
|
4月前
|
存储 网络协议 编译器
c位域
c位域
39 0
|
4月前
|
存储 数据安全/隐私保护 C语言
位域
位域
24 0
|
4月前
位域的使用
位域的使用。
24 1
|
存储 编译器 C语言
关于内存对齐
关于内存对齐
114 0
|
编译器 Linux C++
C/C++中内存对齐的问题的讲解
C/C++中内存对齐的问题的讲解
145 0
|
机器学习/深度学习 存储 编译器
一文轻松理解内存对齐(1)
一文轻松理解内存对齐
461 0
|
存储 编译器
一文轻松理解内存对齐(2)
一文轻松理解内存对齐
177 0