alignof和alignas

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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值