这2种字节对齐我都在用,感觉没什么区别,这次又碰到了,通过查看MDK帮助文档,终于弄清楚了,这2个只有细微的差别。

Comparison of a __packed struct and a #pragma packed struct

第1种实现方法

__packed struct foobar
{char x;short y[10];
};
short get_y0(struct foobar *s)
{// Unaligned-capable loadreturn *s->y;
}
short *get_y(struct foobar *s)
{return s->y;    // Compile error
}
 第二种实现Compiler User Guide: Comparisons of an unpacked struct, a __packed struct, and a struct with individually __packed fields, and of a __packed struct and a #pragma packed struct

#pragma push
#pragma pack(1)
struct foobar
{char x;short y[10];
};
#pragma pop
short get_y0(struct foobar *s)
{// Unaligned-capable loadreturn *s->y;
}
short *get_y(struct foobar *s)
{return s->y;    // No error// Potentially illegal unaligned load,// depending on use of result
}

In the first implementation, taking the address of a field in a __packed struct or a __packed field in a struct yields a __packed pointer, and the compiler generates a type error if you try to implicitly cast this to a non-__packed pointer. In the second implementation, in contrast, taking the address of a field in a #pragma packed struct does not yield a __packed-qualified pointer. However, the field might not be properly aligned for its type, and dereferencing such an unaligned pointer results in Undefined behavior.

如果使用此指针,则Potentially illegal unaligned load, depending on use of result

在第一个实现中,获取字节对齐结构中的字段或字节对齐结构中的成员字段的地址会生成一个packed指针,如果试图将其隐式转换为非packed指针,编译器会生成一个类型错误。

相比之下,在第二种实现中,在#pragma packed struct中获取字段的地址不会生成_packed-qualified指针。但是字段可能没有正确对齐其类型,间接引用此未对齐的指针会导致未定义的行为。

潜在的非法未对齐加载,取决于结果的使用

AC5与AC6用法不太一样,详细如下:

AC5

Compiler User Guide: Comparisons of an unpacked struct, a __packed struct, and a struct with individually __packed fields, and of a __packed struct and a #pragma packed struct

#pragma push
#pragma pack(1)
struct foobar
{char x;short y[10];
};
#pragma pop

AC6

#pragma pack(push)

#pragma pack([n])

#pragma pack(pop).

MDK 字节对齐 __packed 与 #pragma packed区别相关推荐

  1. 结构对齐--__packed与#pragma pack

    1.ANSI C规定 ANSI C规定一种结构类型的大小是它所有字段的大小以及字段之间或字段尾部的填充区大小之和. 填充区就是为了使结构体字段满足内存对齐要求而额外分配给结构体的空间. 那么结构体本身 ...

  2. 更改结构体的内存字节对齐方式--经典

    结构体字节对齐 http://blog.163.com/ecy_fu/blog/static/4445126200910603739941/ http://hi.baidu.com/skyland_l ...

  3. Hello C(八)——内存字节对齐

    一.内存字节对齐简介 1.内存字节对齐 计算机中内存空间都是按照字节划分的,从理论上讲对任何类型的变量的访问可以从任何地址开始,但是在程序实际编译过程中,编译器会对数据类型在编译过程中进行优化对齐,编 ...

  4. 关于C++中四字节对齐的坑

    最近做一个工程,大体的意思是在程序中定义一个结构,运行中会将结构直接写到文件中,然后另一个程序会用同样的结构读出来.为了验证是写文件的程序的问题还是读文件的程序的问题,用winhex来打开文件,仿照结 ...

  5. 一文了解结构体字节对齐

    结构体字节对齐详解 表述如有不正确的地方,欢迎批评指正. C++/C 常见的基本数据类型: bool short (short int) int long (long int) long long ( ...

  6. C语言基础 - 结构体类型字节对齐总结

    一.什么是字节对齐 在计算机中,内存空间是按照字节(1B = 8 bit)划分的,每一个字节都有一个编号,这就是字节的地址.理论上可以从任意起始地址访问任意数据类型的变量,但在实际使用中,访问特定数据 ...

  7. 字节对齐和C/C++函数调用方式学习总结(多篇节选)

    字节对齐和C/C++函数调用方式学习总结 created: 04-06-17 last saved: author: ayixidelu 前言: <***软件编程规范>中提到:" ...

  8. struct 字节对齐

    struct 字节对齐 一.概念 对齐:对齐与数据在内存中的位置相关.如果一个变量的内存地址正好位于它长度的整数倍,被称作自然对齐. 如在32位cpu下,假设一个int变量的地址是 0x0000000 ...

  9. keil+mdk+c语言,keil mdk+stm32的ac5和 ac6两个编译器下的字节对齐操作方法

    最近在使用ac6.9的编译器,编译速度是真的很快,使用stm32的hal库编译速度也比ac5的编译器快很多. 本文试验stm32中字节对齐的代码测试,主要是结构体,因为结构体中实际项目中用到最多,同时 ...

最新文章

  1. RDKit | 比较化合物并通过PCA可视化化学空间
  2. Selector选择器概述||Selector选择器组合使用
  3. Winform中设置ZedGraph的X轴的刻度根据曲线获取
  4. SpringBoot项目启动提示:An attempt was made to call the method org.apache.coyote.AbstractProtocol.setAccept
  5. (转)Maven学习总结(七)——eclipse中使用Maven创建Web项目
  6. Linux 命令之 ulimit 命令-控制shell程序的资源
  7. 一图读懂马云与阿里20年:互联网巨头是如何养成的?
  8. axure html尺寸,Axure 原型 | 教你使用自适应视图构建界面
  9. PyQt5学习--基本窗口控件--QMainWindow
  10. echarts折线图y轴根据数值自动_R语言基础绘图教程——第3章:折线图和带状图...
  11. java数组查找算法_JAVA数组中查找算法中equals和==的问题
  12. 打开终端报错:bash: /某路径/bashrc: No such file or directory
  13. C中无警告输出size_t的值
  14. win7 64位如何安装sql2005
  15. 兄弟FAX-2890更换硒鼓加粉清零方法
  16. 数电课设——基于74系列芯片搭建的交通灯控制系统电路
  17. 微信开放平台----微信扫码登录
  18. iis php一键,phpStudy for IIS (php+IIS一键安装包)下载|phpStudy for IIS (php+IIS一键安装包)官方下载-太平洋下载中心...
  19. ConnectString中enlist设置的含义
  20. 供应链服务平台方案:助供应链服务公司实现商品+决策+物流+售后协同办公

热门文章

  1. 【C#学习笔记】【StackTrace】
  2. win10cmd打不开/闪退怎么解决
  3. Keras进行人民币面额识别(三)
  4. 使用多开关PPTC装置,用于汽车线束保护
  5. win8系统恢复经典---开始菜单
  6. 如何修改svn服务器的端口号,svn服务器地址 不要端口号
  7. centos搭建pptp
  8. 小众框架JeePlus的理解
  9. iOS设计规范HIG
  10. 【图】公路车 如何变速 公路车如何调整速度 法嘴怎么打气