高效的C编程之: 变量类型
r c;
unsigned state;
unsigned flags;
int main ()
{ tx = 1;
rx = 2;
byte = 3;
c = 4;
state = 5;
flags = 6;
printf("%u %u %u %u %u %u\n", tx, rx, byte, c, state, flags);
return 0;
}
使用armcc编译,生成的代码大小如下。
C$$code 132
C$$data 12
如果将全局变量声明为extern,变量的定义在其他文件中,那么生成的代码量将有所增加。
将全局变量声明为extern,生成的代码大小如下。
C$$code 168
C$$data 12
这是因为当将变量声明为extern后,每次访问变量编译器都将从内存重新加载,而不是使用内存偏移,直接访问。
下图显示编译器对声明为extern变量的访问。
解决的办法是将要从外部引用的extern变量定义在一个结构体中。在程序中通过结构体访问外部变量。具体用法如下例所示。
/*************
* globals.h *
*************/
/* DECLARATIONS of globals - included in all sources */
#ifdef __arm
struct globs
{ char tx;
char rx;
图14.2 对extern变量的访问
char byte;
char c;
unsigned state;
unsigned flags;
};
extern struct globs g;
#define tx g.tx
#define rx g.rx
#define byte g.byte
#define c g.c
#define state g.state
#define flags g.flags
#else
extern char tx;
extern char rx;
extern char byte;
extern char c;
extern unsigned state;
extern unsigned flags;
#endif
/*************
* globals.c *
*************/
/* DEFINITIONS of globals - single source file */
#ifdef __arm
# include "globals.h"
struct globs g;
#else
char tx;
char rx;
char byte;
char c;
unsigned state;
unsigned flags;
#endif
/************
* access.c *
************/
#include <stdio.h>
#include "globals.h"
int main ()
{tx = 1;
rx = 2;
byte = 3;
c = 4;
state = 5;
flags = 6;
printf("%u %u %u %u %u %u\n", tx, rx, byte, c, state, flags);
return 0;
}
将变量定义在结构体内有以下几点好处。
· 全局变量使用更小的内存空间。(没有使用结构体占有24字节,而使用结构体之后只占有12字节)
· 全局变量被放置在ZI段而不是RW段,这样就减少了ROM映像文件的大小。
- Linux下C编程基础之:常用编辑器(08-13)
- Linux下C编程基础之:gcc编译器(08-13)
- Linux下C编程基础之:gdb调试器(08-13)
- Linux下C编程基础之:make工程管理器(08-13)
- Linux下C编程基础之:使用autotools(08-13)
- Linux下C编程基础之:实验内容(08-13)