一、什么是alignof和alignas
alignas用来指定对象的对齐字节数。效果和__attribute__((aligned(n)))一样
alignof用来查看对象的对齐字节数。用法类似于sizeof
二、实验
使用alignas修改结构体的对齐字节数,然后用alignof查看是否设置成功。
同时,与__attribute__((aligned(n))) 进行对比。
#include <iostream>
using namespace std;
struct alignas(1) student1
{
char a;
int b;
float c;
};
struct alignas(16) student2
{
char a;
int b;
float c;
};
struct student3
{
char a;
int b;
float c;
}__attribute__((aligned(1)));
struct student4
{
char a;
int b;
float c;
}__attribute__((aligned(16)));
int main()
{
cout << alignof(student1) << endl; //alignas(1)
cout << alignof(student2) << endl; //alignas(16)
cout << alignof(student3) << endl; //__attribute__((aligned(1)))
cout << alignof(student4) << endl; //__attribute__((aligned(16)))
return 0;
}

结论:
alignas和 __attribute__((aligned(n)))的作用完全一样。
但是,它们都只能放大对齐的字节数,而不能缩减。要是我想将对齐的字节数设置为1,该怎么办?
可以使用#pragma pack(n)来设置
#include <iostream>
using namespace std;
#pragma pack(1)
struct student1
{
char a;
int b;
float c;
};
#pragma pack()
int main()
{
cout << alignof(student1) << endl;
return 0;
}
末尾记得加上#pragma pack(),表示设置默认的对齐方式。
三、最后
感觉alignas是对__attribute__((aligned(n)))的一种简化,让程序更加清爽。

472

被折叠的 条评论
为什么被折叠?



