深入学习C++关键字: alignas与alignof

334 阅读1分钟
关键字: 
    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字节。


对于structclass数据类型而言,如果不指明对齐字节数,操作系统会以其中
最大的一个变量的大小作为默认对齐字节数。


示例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。
*/