alignas
设置对齐字节
alignof
获得对齐字节数
示例
#include <iostream>
struct alignas(16)test1 {
unsigned char c;
int i;
double d;
};
struct alignas(8)test3 {
unsigned char c;
int i;
double d;
};
struct test2 {
char c;
alignas(16)int i;
double d;
};
int main() {
std::cout << sizeof(char) << std::endl;
std::cout << sizeof(int) << std::endl;
std::cout << sizeof(double) << std::endl;
test2* t = new test2();
std::cout << "base addr:" << t << std::endl;
std::cout << "int addr:" << &(t->i) << std::endl;
std::cout << "double addr:" << &(t->d) << std::endl;
std::cout << "next addr:" << (t + 1) << std::endl;
std::cout << sizeof(test2) << " " << alignof(test2) << std::endl;
test1* t1 = new test1();
std::cout << "base addr:" << t1 << std::endl;
std::cout << "int addr:" << &(t1->i) << std::endl;
std::cout << "double addr:" << &(t1->d) << std::endl;
std::cout << "next addr:" << (t1 + 1) << std::endl;
std::cout << sizeof(test1) << " " << alignof(test1) << std::endl;
test3* t3 = new test3();
std::cout << "base addr:" << t3 << std::endl;
std::cout << "int addr:" << &(t3->i) << std::endl;
std::cout << "double addr:" << &(t3->d) << std::endl;
std::cout << "next addr:" << (t3 + 1) << std::endl;
std::cout << sizeof(test3) << " " << alignof(test3) << std::endl;
return 0;
}
输出
1
4
8
168
base addr:0x55f3173bc280
int addr:0x55f3173bc290
double addr:0x55f3173bc298
next addr:0x55f3173bc2a0
32 16
base addr:0x55f3173bc2b0
int addr:0x55f3173bc2b4
double addr:0x55f3173bc2b8
next addr:0x55f3173bc2c0
16 16
base addr:0x55f3173bc2d0
int addr:0x55f3173bc2d4
double addr:0x55f3173bc2d8
next addr:0x55f3173bc2e0
16 8
解释
test2
int类型的i变量内存起始地址相对于test1的结构体地址偏移16字节. 也就是说char 类型的c变量占据了16个自己, int i占据了8字节, double d占据了8个字节.
因此sizeof的输出为32, aliginof为16.
test1
char c占据4字节, int i占据4字节, double d占据8字节.
因此sizeof的输出为16, alignof为16.
test3
char c占据4字节, int i占据4字节, double d占据8字节.
因此sizeof的输出为16, alignof为8.