如何自定义对象字节对齐方式?

C语言中, 每个完整的对象都具有字节对齐要求. 比如基本数据类型一般参照类型本身大小字节对齐, char类型对象按1字节对齐, short类型按2字节对齐等. C11中提供了 查看自定义 对象字节对齐方式的方法. 关于字节对齐见这里

  • 查看对象字节对齐方式: _Alignof 操作符

    • 用法: _Alignof(typename) 返回size_of类型的typename类型对象的对齐方式. _Alignof(char) 返回1, 表示char类型对象按1字节对齐.
    • 注意:
      (1) 引用 stdalign.h 头文件后可以直接使用_Alignof对应的宏 alignof
      (2) typename 可以是基本类型 枚举类型 结构体 联合体等, 但是必须是类型名(这里存疑, 使用对象名也可以)
      (3) 可以使用 alignof(max_align_t) 获取当前实现支持的最大对齐方式
  • 自定义对象字节对齐方式: _Alignas 操作符

    • 用法:
      (1) _Alignas(typename) 将对象声明为按 Alignof(_typename) 大小对齐方式对齐. 比如 char _Alignas(int) ch; ch按_Alignof(int)大小对齐.
      (2) _Alignas(expression) 将对象声明为按 expression 大小对齐方式对齐. 比如 char _Alignas(4) ch; ch按4字节大小对齐.
    • 注意:
      (1) 引用 stdalign.h 头文件后可以直接使用_Alignas对应的宏 alignas
      (2) _Alignas操作数指定的字节对齐大小不能小于当前实现默认的对齐大小
      (3) _Alignas操作数应该是0, 1, 2, 4或4的倍数等无符号整数, 但不能超过max_align_t的大小
      (4) _Alignas(0)表示按默认对齐方式对齐
// 自定义字节对齐方式
#include <sdtio.h>
#include <stdalign.h>
#include <stddef.h>

int main()
{
    // 查看字节对齐方式
    size_t size = _Alignof(max_align_t);
    printf("当期实现支持的最大字节对齐方式: %zu\n", size);
    size = alignof(int);
    printf("int类型对象默认字节对齐方式: %zu\n", size);

    // 自定义字节对齐方式
    size = alignof(char);
    printf("char类型对象默认字节对齐方式: %zu\n", size);
    char _Alignas(int) ch = 'a';
    size = alignof(ch);
    printf("char类型对象ch自定义字节对齐方式: %zu\n", size);

    // 选择选项中最大的字节对齐方式
    int alignas(32) alignas(64) alignas(int) n = 0;
    size = alignof(n);
    printf("int类型对象n自定义字节对齐方式: %zu\n", size);

    return 0;
}
阅读更多
版权声明:本文为博主原创文章,欢迎转载,转载请注明出处。 https://blog.csdn.net/qq_31504597/article/details/79962104
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭