关键字:
alignas //c++11新特性,指定struct,class的字节对齐数。
alignof //c++11新特性,查看当前数据类型以多少字节对齐。
示例1:
/*
以32位操作系统环境为例
在32位操作系统环境下,char占一个字节,int占4个字节。
*/
#include <iostream>
struct alignas(16) Person {
char age;
int id;
}; //生成的Person对象以16个字节对齐(即以16的倍数分配内存)
int main() {
std::cout << sizeof(Person) << std::endl;//此时输出16
std::cout << alignof(Person) << std::endl;//此时输出16
}//值得注意的是alignas不允许规定的字节对齐数 < 默认的字节对齐数
//不然的话无法生效。
示例2:
/*
以32位操作系统环境为例
在32位操作系统环境下,char占一个字节,int占4个字节,double占8字节。
*/
#include <iostream>
struct Person {
char age;
int id;
double money;
};
int main() {
std::cout << sizeof(Person) << std::endl;//此时输出16
std::cout << alignof(Person) << std::endl;//此时输出8
}//Person有三个变量,char和int分配8字节足够,double分配8字节刚好
//所以一共16字节。
对于struct,class数据类型而言,如果不指明对齐字节数,操作系统会以其中
最大的一个变量的大小作为默认对齐字节数。
示例3:
/*
以32位操作系统环境为例
在32位操作系统环境下,char占一个字节,int占4个字节,double占8字节。
*/
#include <iostream>
struct alignas(16) Student {
char age;
int id;
};
struct Person {
Student jack;
double money;
};
int main() {
std::cout << sizeof(Person) << std::endl;//此时输出32
std::cout << alignof(Person) << std::endl;//此时输出16
}
/*
由于Student指明了字节对齐数16,所以Student不会以4字节(int大小)进行对齐
Person没有指明,所以,以16(此时Student最大)作为默认字节对齐数
也就是说,如果Person此时想要自己指明字节对齐数,必须>=16。
*/