单片机开发之节省内存大法(C语言版本)
首先聊一聊
共联体-union
大小端小知识
大端模式(Big_endian):一个数据的高字节存储在低地址,低字节存储在高地址。其指针指向的首地址位于低地址。
小端模式(Little_endian):一个数据的高字节存储在高地址,低字节存储在低地址。其指针指向的首地址位于高地址。
#include<stdio.h>
typedef union _tag_test
{
char a;
int b;
}uTest;
uTest test;
unsigned char Checktype(void);
int main(void)
{
printf("%x\n",(unsigned int)&test.a);
printf("%x\n",(unsigned int)&test.b);
printf("%x\n",(unsigned int)&test);
printf("%d\n",Checktype());
}
unsigned char Checktype(void)
{
uTest chk;
chk.b = 0x01;
if(chk.a == 0x01)return 1;
return 0;
}
位域
#include<stdio.h>
//结果:编译通过
//原因:常规形式(结构体占用两个字节)
typedef struct _tag_test1
{
char a:1;
char b:1;
char c:1;
char d:6;
}sTest1;
//结果:编译无法通过
//原因:d的位域长度10超过了char类型长度
/*
typedef struct _tag_test2
{
char a:1;
char b:1;
char c:1;
char d:10;
}sTest2;
*/
//结果:编译可通过
//原因:下面使用无名位域,且占8个字节
typedef struct _tag_test3
{
int a:1;
int b:1;
int :0;//无名位域
int c:1;
}sTest3;
int main(void)
{
printf("%d\n",sizeof(sTest1));
printf("%d\n",sizeof(sTest3));
printf("欢迎关注公众号:最后一个bug\n");
}
结构体对齐
#include<stdio.h>
#pragma pack(1)
//有字节对齐预编译结果为:12,8
//无字节对齐预编译结果为:6,6
typedef struct _tag_test1{
char a;
int b;
char c;
}STest1;
typedef struct _tag_test2{
int b;
char a;
char c;
}STest2;
int main(void)
{
printf("%d\n",sizeof(STest1));
printf("%d\n",sizeof(STest2));
printf("欢迎关注公众号:最后一个bug\n");
}
算法优化