CAP结构体之字节对齐

这篇具有很好参考价值的文章主要介绍了CAP结构体之字节对齐。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  • 🍅 我是蚂蚁小兵,专注于车载诊断领域,尤其擅长于对CANoe工具的使用
  • 🍅 寻找组织 ,答疑解惑,摸鱼聊天,博客源码,点击加入👉【相亲相爱一家人】
  • 🍅 玩转CANoe,博客目录大全,点击跳转👉

CAP结构体之字节对齐,CANoe,CAPL,字节对齐


CAPL为什么也要理解字节对齐呢?

一般情况下,我们在定义/使用结构体的情况下,不需要考虑字节对齐的问题,因为CAPL运行在WIndows系统上,我们也不差那点内存消耗,但是如果你想更进一步的运用结构体,比如下面的CAPL函数结构体和数组想换转换时就要考虑到结构体字节对齐的问题了,不然有可能得不到期望的结果

CAP结构体之字节对齐,CANoe,CAPL,字节对齐CAP结构体之字节对齐,CANoe,CAPL,字节对齐

CAPL 字节对齐脚本实例

计算机中内存大小的基本单位是字节(byte),理论上来讲,可以从任意地址访问某种基本数据类型,但是实际上,为了内存读写效率,计算机并非逐字节大小读写内存,而是以2,4,或8的倍数的字节块来读写内存,如此一来就会对基本数据类型的合法地址作出一些限制,即它的地址必须是2,4或8的倍数。那么就要求各种数据类型按照一定的规则在空间上排列,这就是对齐。

CAPL 基于C语言,但是CAPL有自己的字节对齐规则,且CAPL封装了自己的函数来读取字节对齐和设置字节对齐,下图是结构体字节对齐的相关函数
CAP结构体之字节对齐,CANoe,CAPL,字节对齐
先看一个简单的示例,结构元元素是相同的元素,结构体大小就是所有元素的字节大小之和。

on key 'b'
{
 struct Point
  {   
    byte x;         // offset 0, size 1
    byte y;         // alignment 1, offset 1, size 1, padding before: 0
  };               // size 2, alignment (of the struct) 1
  

  write("结构体占内存字节数:%d",__size_of(struct Point));
  write("结构体的字节对齐:%d",__alignment_of(struct Point));
  write("结构体的元素x内存地址偏移量:%d",__offset_of(struct Point,x));  
  write("结构体的元素y内存地址偏移量:%d",__offset_of(struct Point,y));  
}

输出结果
Program / Model 结构体占内存字节数:2
Program / Model 结构体的字节对齐:1
Program / Model 结构体的元素x内存地址偏移量:0
Program / Model 结构体的元素y内存地址偏移量:1

  • 结构体元素不是相同类型时:
  • 字节对齐大小是结构体中元素最大的那个元素,如果最大成员的类型是qword(8字节),则该结构体的字节对齐大小就是8字节
  • 如果结构体的后一个成员比前一个成员大,则后一个成员的内存地址偏移量 = 前一个内存地址偏移量 + 后一个成员的字节大小 。比如qword前面是byte ,则 qword的内存偏移量是就是(0+8)
  • 如果结构体的后一个成员比前一个小,则后一个成员的内存地址偏移量 = 前一个内存地址偏移量 + 前一个成员字节大小 。 比如byte z比 qword y 小,则 byte z的偏移量(16)= 8+8
  • 结构体占内存大小(20) = 最后一个元素的偏移量(18) + 它的大小(2)
on key 'b'
{
struct LongPoint 
{  
  byte x;              // offset 0, size 1
  qword y;             // alignment 8, offset 8, size 8, padding before: 7
  byte z;             // alignment 1, offset  16, size 1, padding before: 0
  int k;             // alignment 2, offset  18, size 2, padding before: 1
};                   // size 20, alignment (of the struct) 8
  

  write("结构体占内存字节数:%d",__size_of(struct LongPoint));
  write("结构体的字节对齐:%d",__alignment_of(struct LongPoint));  
  write("结构体的元素x内存地址偏移量:%d",__offset_of(struct LongPoint,x)); 
  write("结构体的元素y内存地址偏移量:%d",__offset_of(struct LongPoint,y)); 
  write("结构体的元素z内存地址偏移量:%d",__offset_of(struct LongPoint,z)); 
  write("结构体的元素k内存地址偏移量:%d",__offset_of(struct LongPoint,k)); 
}

输出结果
Program / Model 结构体占内存字节数:20
Program / Model 结构体的字节对齐:8
Program / Model 结构体的元素x内存地址偏移量:0
Program / Model 结构体的元素y内存地址偏移量:8
Program / Model 结构体的元素y内存地址偏移量:16
Program / Model 结构体的元素y内存地址偏移量:18

CAPL字节对齐的原则:字节对齐数字只有1, 2, 4, 8可以用,如果没有指定,则默认字节对齐大小为结构体元素中最大元素的字节大小。可以通过_align() 函数来指定对齐大小
下面代码通过设置_align(1) ,_align(2) ,_align(4) 来对比下结果。

on key 'b'
{
  
{
   struct LongPoint 
  {  
    byte x;              
    qword y;             
    byte z;             
    int k;            
  };                   
  
  write("*********************默认对齐大小********************************");
  write("结构体占内存字节数:%d",__size_of(struct LongPoint));
  write("结构体的字节对齐:%d",__alignment_of(struct LongPoint));  
  write("结构体的元素x内存地址偏移量:%d",__offset_of(struct LongPoint,x)); 
  write("结构体的元素y内存地址偏移量:%d",__offset_of(struct LongPoint,y)); 
  write("结构体的元素z内存地址偏移量:%d",__offset_of(struct LongPoint,z)); 
  write("结构体的元素k内存地址偏移量:%d",__offset_of(struct LongPoint,k)); 
}
  
{
  _align(1) struct LongPoint 
  {  
    byte x;              
    qword y;             
    byte z;             
    int k;            
  };                   
  
  write("*********************_align(1) ********************************");
  write("结构体占内存字节数:%d",__size_of(struct LongPoint));
  write("结构体的字节对齐:%d",__alignment_of(struct LongPoint));  
  write("结构体的元素x内存地址偏移量:%d",__offset_of(struct LongPoint,x)); 
  write("结构体的元素y内存地址偏移量:%d",__offset_of(struct LongPoint,y)); 
  write("结构体的元素z内存地址偏移量:%d",__offset_of(struct LongPoint,z)); 
  write("结构体的元素k内存地址偏移量:%d",__offset_of(struct LongPoint,k)); 
}
{
  _align(2) struct LongPoint 
  {  
    byte x;              
    qword y;             
    byte z;             
    int k;            
  };                   
  
  write("*********************_align(2) ********************************");
  write("结构体占内存字节数:%d",__size_of(struct LongPoint));
  write("结构体的字节对齐:%d",__alignment_of(struct LongPoint));  
  write("结构体的元素x内存地址偏移量:%d",__offset_of(struct LongPoint,x)); 
  write("结构体的元素y内存地址偏移量:%d",__offset_of(struct LongPoint,y)); 
  write("结构体的元素z内存地址偏移量:%d",__offset_of(struct LongPoint,z)); 
  write("结构体的元素k内存地址偏移量:%d",__offset_of(struct LongPoint,k)); 
}
{
  _align(4) struct LongPoint 
  {  
    byte x;              
    qword y;             
    byte z;             
    int k;            
  };                   
  
  write("*********************_align(4) ********************************");
  write("结构体占内存字节数:%d",__size_of(struct LongPoint));
  write("结构体的字节对齐:%d",__alignment_of(struct LongPoint));  
  write("结构体的元素x内存地址偏移量:%d",__offset_of(struct LongPoint,x)); 
  write("结构体的元素y内存地址偏移量:%d",__offset_of(struct LongPoint,y)); 
  write("结构体的元素z内存地址偏移量:%d",__offset_of(struct LongPoint,z)); 
  write("结构体的元素k内存地址偏移量:%d",__offset_of(struct LongPoint,k)); 
}

}

输出结果:
Program / Model 默认对齐大小***********
Program / Model 结构体占内存字节数:20
Program / Model 结构体的字节对齐:8
Program / Model 结构体的元素x内存地址偏移量:0
Program / Model 结构体的元素y内存地址偏移量:8
Program / Model 结构体的元素z内存地址偏移量:16
Program / Model 结构体的元素k内存地址偏移量:18
Program / Model *********************_align(1) ********************************
Program / Model 结构体占内存字节数:12
Program / Model 结构体的字节对齐:1
Program / Model 结构体的元素x内存地址偏移量:0
Program / Model 结构体的元素y内存地址偏移量:1
Program / Model 结构体的元素z内存地址偏移量:9
Program / Model 结构体的元素k内存地址偏移量:10
Program / Model *********************_align(2) ********************************
Program / Model 结构体占内存字节数:14
Program / Model 结构体的字节对齐:2
Program / Model 结构体的元素x内存地址偏移量:0
Program / Model 结构体的元素y内存地址偏移量:2
Program / Model 结构体的元素z内存地址偏移量:10
Program / Model 结构体的元素k内存地址偏移量:12
Program / Model *********************_align(4) ********************************
Program / Model 结构体占内存字节数:16
Program / Model 结构体的字节对齐:4
Program / Model 结构体的元素x内存地址偏移量:0
Program / Model 结构体的元素y内存地址偏移量:4
Program / Model 结构体的元素z内存地址偏移量:12
Program / Model 结构体的元素k内存地址偏移量:14

CAP结构体之字节对齐,CANoe,CAPL,字节对齐

🌎总结

CAP结构体之字节对齐,CANoe,CAPL,字节对齐

CAP结构体之字节对齐,CANoe,CAPL,字节对齐文章来源地址https://www.toymoban.com/news/detail-520301.html

  • 🚩要有最朴素的生活,最遥远的梦想,即使明天天寒地冻,路遥马亡!

  • 🚩如果这篇博客对你有帮助,请 “点赞” “评论”“收藏”一键三连 哦!码字不易,大家的支持就是我坚持下去的动力。
    CAP结构体之字节对齐,CANoe,CAPL,字节对齐

到了这里,关于CAP结构体之字节对齐的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 结构体占用内存大小如何确定?-->结构体字节对齐 | C语言

    结构体占用内存大小如何确定?-->结构体字节对齐 | C语言

    目录 一、什么是结构体 二、为什么需要结构体 三、结构体的字节对齐 3.1、示例1 3.2、示例2 3.3、示例3  3.4、示例4 3.5、示例5 四、结构体字节对齐总结         结构体是将不同类型的数据按照一定的功能需 求进行整体封装,封装的数据类型与大小均可以由用户指定。 结

    2024年01月17日
    浏览(9)
  • 保护你的CANoe项目:CAPL文件加密与安全实践

    保护你的CANoe项目:CAPL文件加密与安全实践

    ✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🔗 专栏地址:Vector-CAPL 自动化探索

    2024年02月12日
    浏览(12)
  • 【CANoe】CAPL_UDS安全算法dll制作

    【CANoe】CAPL_UDS安全算法dll制作

    使用UDS进行刷写时,需要27服务解密后,才能正确执行刷写,本文提供两种制作27解密dll的方法,用于CANoe的CAPL脚本中。 【特别说明】 遇到问题时,CAPL帮助文档提供了很好的指引,大家可以好好利用。 CAPL DLL示例所在路径: C:UsersPublicDocumentsVectorCANoeSample Configurations 12.

    2024年02月06日
    浏览(75)
  • C语言结构体字节对齐(内存对齐)之#pragma pack和__attribute__((packed)的使用

    C语言结构体字节对齐(内存对齐)之#pragma pack和__attribute__((packed)的使用

    在不使用 #pragma pack 和 __attribute__((packed) 等选项来自定义字节对齐大小的情况下,关于正常字节对齐的描述,可参考博文: C/C++计算类/结构体和联合体(union)所占内存大小(内存对齐问题)_联合体占用的内存空间_SOC罗三炮的博客-CSDN博客 同学可以尝试将char f 注释,最后将

    2024年02月12日
    浏览(10)
  • CANoe中使用CAPL刷写流程详解(Trace图解)(CAN总线)

    CANoe中使用CAPL刷写流程详解(Trace图解)(CAN总线)

    🍅 我是 蚂蚁小兵 ,专注于车载诊断领域,尤其擅长于对CANoe工具的使用 🍅 寻找组织 ,答疑解惑,摸鱼聊天,博客源码,点击加入👉【相亲相爱一家人】 🍅 玩转CANoe,博客目录大全,点击跳转👉 网上找了张图,基本描述了刷写的流程 我也截图了Vflash 刷写的一个过程图

    2024年02月02日
    浏览(64)
  • Canoe CAPL语言实现TCP连接与通信流程(TCP相关API函数详细使用)

    Canoe CAPL语言实现TCP连接与通信流程(TCP相关API函数详细使用)

    本文主要讲解CAPL语言里是如何实现TCP连接通信的,所以在本文开始前需要一些前期准备。 1、 首先是需要了解TCP的报文格式,连接三次握手,断开连接四次挥手的相关知识,推荐以下两位博主文章。 深入浅出TCP三次握手 (多图详解) 两张动图-彻底明白TCP的三次握手与四次

    2024年02月07日
    浏览(54)
  • 2022-03-31 Amr-nb格式字节对齐、非字节对齐的转换和解码处理(含源码)

    2022-03-31 Amr-nb格式字节对齐、非字节对齐的转换和解码处理(含源码)

    AMR的格式分为AMR-NB、AMR-WB、AMR-WB+ 三种格式的区分和差异可以自行百度,在这里就不做细分了。 我相信,找到这篇文章的基本已经是入门了。 这一次我们主要处理的是AMR-NB格式的数据。本文主要贴出了如何区分字节对齐、非字节对齐的方法,以及如何处理解码?( 需要完整

    2024年02月02日
    浏览(40)
  • C语言----字节对齐

    C语言----字节对齐

            针对字节对齐,百度百科的解释如下:         字节对齐是字节按照一定规则在空间上排列,字节(Byte)是计算机信息技术用于计量存储容量和传输容量的一种计量单位,一个字节等于8位二进制数,在UTF-8编码中,一个英文字符等于一个字节,字节按照一定规则在

    2024年02月13日
    浏览(6)
  • 位域和字节对齐

    位域和字节对齐

    位域是一种特殊的结构体成员,它允许将一个字节或多个字节中的每个位作为一个独立的成员来使用。位域的语法形式为: ``` ``` 其中,type 表示位域成员的类型,可以是 int、unsigned int、signed int 或者 char。member_name 表示位域成员的名称,可以省略。width 表示位域成员所占用的

    2024年02月05日
    浏览(9)
  • c/c++--字节对齐(byte alignment)

    c/c++--字节对齐(byte alignment)

    在所有结构体成员的字节长度都 没有超出操作系统基本字节单位 (32位操作系统是4,64位操作系统是8)的情况下 按照结构体中字节最大的变量长度来对齐; 若结构体中某个变量字节 超出操作系统基本字节单位 那么就按照 系统字节单位来对齐 。 注意: 并不是32位就直接按照

    2024年02月07日
    浏览(8)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包