sizeof应用的小陷阱

本篇笔记主要介绍在项目开发中,使用sizeof的一个要注意的地方。分别在8位机microchip PIC18F46K22, 16位机microchip dsPIC33EP512MU810 以及飞思卡尔32位MCU MKV46F256上做了测试。

sizeof作用就是返回一个对象或者类型所占的内存字节数。返回值是size_t,这个值依赖于编译系统,一般在嵌入式中我们常见的是返回int型. 如果将sizeof的返回值付给一个类型不符的变量,MISRA 规则会报警告。还有一点要注意,C99标准规定,函数、不能确定类型的表达式以及位域(bit-field)成员不能被计算sizeof值。 假设我们定义结构体如下 typedef struct { uint8_t u8test1; uint16_t u16test2; uint32_t u32test3; }strTestCnt_Type; strTestCnt_Type strTestCntt; 那么用sizeof 求上述结构体变量,则返回长度是多少呢? 在8位平台上返回值为7

在16位平台上返回值为8,

在32位平台上返回值为8,

调换结构体成员变量顺序为 typedef struct { uint8_t u8test1; uint32_t u32test3; uint16_t u16test2; }strTestCnt_Type; strTestCnt_Type strTestCntt; 在8位平台上返回值为7

在16位平台上返回值为8,

在32位平台上返回值为12,

由以上测试可以看到sizeof的返回值在不同的平台上不有不同的结果,在实际应用中一定要注意,尤其是在32位系统上,一定要小心应用sizeof,以免引起错误。这就是传说中的字节对齐啊!为什么需要字节对齐,这样有助于加快计算机的取数速度,否则就得多花指令周期了。为此,编译器默认会对结构体进行处理,让宽度为2的基本数据类型都位于能被2整除的地址上,让宽度为4的基本数据类型都位于能被4整除的地址上,小小陷阱,希望不要掉进去哦O(∩_∩)O~

原文发布于微信公众号 - 嵌入式程序猿(InterruptISR)

原文发表时间:2016-02-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏康怀帅的专栏

Shell date 命令详解

以给定的格式显示当前时间。 %% 一个文字的 % %a 当前locale 的星期名缩写(例如: 日,代表星期日) %A 当前locale 的星...

3674
来自专栏狮乐园

多维数组取值问题

给予一个多维数组和一个描述取值路径的一维数组, 通过调用函数f返回取值路径描述的值,如 f([[1, 2], [3, 4], [5, 6]], [0, 0]) ...

1573
来自专栏新工科课程建设探讨——以能源与动力工程专业为例

5.2.2 二维导热算例-迭代计算

我们首先介绍温度场的求解吧,假设边界条件和初始条件已经设定。在贴代码之前,我们先谈谈这个类需要什么属性和行为:节点数组用于存储计算变量、网格大小、维度定义、计算...

1100
来自专栏我有一个梦想

UE4中的单映射:TMap容器

一、TMap<T>是么 TMap<T>是UE4中的一种关联容器,每个键都关联着一个值,形成了单映射关系。因此你可以通过键名来快速查找到值。此外,单映射要求每...

2219
来自专栏JavaQ

写这样的方法让人很反感

写作文要做到段落清晰、每段思路流畅、每段主旨明确,要有一条清晰的线穿插整篇内容,编写程序代码和写作文是一个套路。一个类就像一篇小作文,类的单一职责就是小作文要叙...

3447
来自专栏C/C++基础

基数排序简介及其并行化

  基数排序号称线性时间排序算法中性能最好,速度最快的排序算法。本文将简要概括其算法思想,串行代码及其并行化。

1391
来自专栏java系列博客

UML类图

2893
来自专栏iOS

深入理解苹果系统(Unicode)字符串的排序方法

本文主要讲述下载苹果系统-方法所引发的对排序规则的深入研究。

4517
来自专栏IT可乐

深入理解计算机系统(2.1)------信息的存储和表示

  前面我们介绍了《深入理解计算机系统》第一章的内容----计算机系统漫游。包括简单介绍了 Hello World 程序在计算机中是如何运行的,存储设备的层次结...

2328
来自专栏take time, save time

你所能用到的BMP格式介绍(二)

一、可能你忽视的基础         在正式开始之前,我不得不从最基本的地方开始,因为这些地方大多数人会忽视的一干二净,如果不在开始进行说明,那么在后面一定会有...

2967

扫码关注云+社区

领取腾讯云代金券