__attribute__((aligned(n)))内存对齐

使用环境Linux version 4.15.0-29-generic (buildd@lgw01-amd64-057) (gcc version 7.3.0 (Ubuntu 7.3.0-16ubuntu3))

关于设置内存对齐方式上有两种方式:

  1. __attribute__((aligned(n)))编译器按照n个字节对齐
  2. #pragma pack(n) 编译器将按照n个字节对齐;#pragma pack () 取消指定对齐,恢复缺省对齐

方式一__attribute__((aligned(n)))

  1. 一开始去网上找关于它的对齐规则,找到一个十几万阅读,200多收藏的帖子学习,按照设置方式进行测试,发现根本就是错误的(也可能环境不同?这明明是跟编译器有关呀),下面我将用直观的代码形式演示它的正确设置方式!

  2. #include <iostream>using namespace std;/* 按照结构体中最大成员类型的字节对齐,最大数据类型是int类型,4个字节 */
    struct Test1
    {int a;char b;int c;
    }; /* 【按照aligned(n)中的n】与【结构体中最大数据类型字节数】中的最大值对齐 */
    struct Test2
    {int a;char b;int c;
    }__attribute__((aligned(8)));
    /* 如果aligned(n)中的n填小于结构体中最大数据类型的值,
    那么程序员设置的自定义对齐方式是不会生效的 */ /* 按照一个字节对齐 */
    struct Test3
    {int a;char b;int c;
    }__attribute__((packed)); // 不等同于__attribute__((aligned(1)));int main()
    {   cout << "sizeof(Test1) = " << sizeof(Test1) << endl;cout << "sizeof(Test2) = " << sizeof(Test2) << endl;cout << "sizeof(Test3) = " << sizeof(Test3) << endl;return 0;
    }
    

    运行结果:

    sizeof(Test1) = 12
    sizeof(Test2) = 16
    sizeof(Test3) = 9
    

方式二:#pragma pack(n)

  1. #include <iostream>using namespace std;/* 设置内存对齐方式按照1个字节对齐, 如果pack(n)中的n大于结构体中
    最大数据类型的值,那么设置会失效,编译器只会按照两者中的最小的那个值对齐,
    与aligned(n)正好是相反的 */
    #pragma pack(1) struct Test1
    {int a;char b;int c;
    };/* 恢复默认对齐方式 */
    #pragma pack()
    struct Test2
    {int a;char b;int c;
    };/* 此时pack(n)中的n大于int的长度,所以会设置失败,编译器
    还是会按照四个字节对齐 */
    #pragma pack(8)
    struct Test3
    {int a;char b;int c;
    };int main()
    {   cout << "sizeof(Test1) = " << sizeof(Test1) << endl;cout << "sizeof(Test2) = " << sizeof(Test2) << endl;cout << "sizeof(Test3) = " << sizeof(Test3) << endl;return 0;
    }
    
  2. 运行结果

    sizeof(Test1) = 9
    sizeof(Test2) = 12
    sizeof(Test3) = 12
    

这就是两种对齐方式的简单介绍

本人能力有限,如有错误,望不吝指正;原创不易,欢迎转载,转载请注明出处

aligned内存对齐相关推荐

  1. Eigen向量化内存对齐/Eigen的SSE兼容,内存分配/EIGEN_MAKE_ALIGNED_OPERATOR_NEW

    1.总结 对于基本数据类型和自定义类型,我们需要用预编译指令来保证栈内存的对齐,用重写operator new的方式保证堆内存对齐.对于嵌套的自定义类型,申请栈内存时会自动保证其内部数据类型的对齐,而 ...

  2. nginx源码分析--内存对齐处理

    1.nginx内存对齐主要是做2件事情: 1) 内存池的内存地址对齐: 2) 长度按照2的幂取整.因为前面结构体已经是对齐了,如果后面的内存池每一小块不是2的幂,那么后面的就不能对齐 2.通用内存对齐 ...

  3. C++中的内存对齐介绍

    网上有很多介绍字节对齐或数据对齐或内存对齐的文章,虽然名字不一样,但是介绍的内容大致都是相同的.这里以内存对齐相称.注:以下内容主要来自网络. 内存对齐,通常也称为数据对齐,是计算机对数据类型合法地址 ...

  4. 内存对齐/字节对齐/数据对齐/地址总线对齐

    其实是使用InitializeAcl()时发现有个aligned,可我不知道什么是aligned 于是乎我就先搜索了对齐,结果发现了一大堆,什么[字节对齐].[内存对齐].[地址总线 对齐].[数据对 ...

  5. C 语言编程 — 内存对齐

    目录 文章目录 目录 内存对齐 为什么要内存对齐? 内存对齐跟平台有关 对齐系数 使用 pragma 宏指令修改对齐系数 内存对齐的原则 内存对齐 计算机的内存空间都是按照字节划分的,元素(包括:变量 ...

  6. c++-内存管理-内存对齐方式

    内存对齐是什么 是一个数据类型所能存放的内存地址的属性,这个属性是一个无符号的整数,并且这个整数必须是2的N次方,当为8时,指这个数据类型所定义出来的变量内存地址都是8的倍数. 为什么需要内存对齐 使 ...

  7. GNU C - 关于8086的内存访问机制以及内存对齐(memory alignment)

    接着前面的文章,这篇文章就来说说menory alignment -- 内存对齐. 一.为什么需要内存对齐? 无论做什么事情,我都习惯性的问自己:为什么我要去做这件事情? 是啊,这可能也是个大家都会去 ...

  8. c 结构体转byte_C中结构体和字节流的互换及内存对齐

    mystruct p; char buff[50]; memcpy(buff,&p,sizeof(p)); //把p的内容以字节形式拷贝到buff中 mystruct* q; q = (mys ...

  9. 关于内存对齐问题的一些资料整理

    我们的讨论从一道经典的题目开始: Intel和微软同时出现的面试题 #pragma pack(8) struct s1{ char a; long b; }; struct s2{ char c; s ...

最新文章

  1. 常用MySQL的命令集锦
  2. linux分析字节序的分类及特点,计算机中的字节序详解 分类: 【Linux/Windows操作系统】 2015-01-07 21:54 97人阅读 评论(0) 收藏...
  3. 小余学调度:学习记录(2022年1月)
  4. 新一代搜索引擎项目 ZeroSearch 设计探索
  5. 详解 meta http-equiv = X-UA-Compatible content = IE=edge,chrome=1 /
  6. python3 zip命令_zip错误:无效的命令参数(无法将zip文件写入终端)
  7. java 读CSV 和 Excel
  8. 证监会将开启私募机构新三板做市试点
  9. 内定抽奖小程序_微信抽奖小程序抽到奖品真的免费吗?
  10. 反转链表-递归反转法
  11. matlab 质心,Matlab中三点确定质心
  12. c语言程序负数,C程序,检查数字是正数还是负数
  13. 做自媒体1年投资4百W亏损370W,自媒体的水太深
  14. 超微服务器怎么开虚拟化,超微6016TT-IBXF服务器Supermicro开启虚拟化支持
  15. [iOS开发]Status Bar Style
  16. 售前和产品经理有何区别?
  17. c语言程序设计勘误,《程序设计基础教程(C语言)》勘误表
  18. input调起ios摄像头拍照旋转问题解决思路
  19. 假如我来架构12306网站
  20. T507|全志T507核心板价格|芯片参数配置|资料|原理图|性能|功耗-飞凌

热门文章

  1. 阿里云盾AliYunDun服务IO超高
  2. 如何快速上手强化学习?
  3. amcharts示例
  4. composer 镜像
  5. 高通骁龙MSM8916核心板 ARM Cortex-A53 四核 中文资料
  6. java web 站内信 设计
  7. 兔子繁殖 c语言编程,c语言写的兔子繁殖- 斐波那契数列.每次只显示前两个.
  8. struct和class异同
  9. 重庆大学计算机学院郭松涛,C.-C.Jay Kuo教授访问重大计算机学院
  10. 在等待缓存锁:无法获得锁 /var/lib/dpkg/lock-frontend。锁正由进程 7939(unattended-upgr)持有... 32秒