您的位置:首页 > 编程语言

keil中对struct结构体静态赋值导致代码急剧膨胀的原因(转)

2015-06-14 18:43 323 查看
typedef struct {

unsigned int flag;

char data[1024];

} wireless, *pwireless;

wireless g_wirless_ch1;

void Main(void)

{

}

如上代码生成的hex内容

:0400000500000000F7

:020000040000FA

:040000001EFF2FE1CF

:00000001FF

如果对g_wirless_ch1结构体执行赋值操作,那么,生成的hex将急剧膨胀:

typedef struct {

unsigned int flag;

char data[100];

} wireless, *pwireless;

wireless g_wirless_ch1 = {0x88888888}; // 静态执行赋值操作

void Main(void)

{

}

如上代码生成的hex内容

:0400000500000000F7

:020000040000FA

:100000001EFF2FE1888888880000000000000000A3

:1000100000000000000000000000000000000000E0

:1000200000000000000000000000000000000000D0

:1000300000000000000000000000000000000000C0

:1000400000000000000000000000000000000000B0

:1000500000000000000000000000000000000000A0

:100060000000000000000000000000000000000090

:100070000000000000000000000000000000000080

:100080000000000000000000000000000000000070

:100090000000000000000000000000000000000060

:1000A0000000000000000000000000000000000050

:1000B0000000000000000000000000000000000040

:1000C0000000000000000000000000000000000030

:1000D0000000000000000000000000000000000020

:1000E0000000000000000000000000000000000010

:1000F0000000000000000000000000000000000000

:1001000000000000000000000000000000000000EF

:1001100000000000000000000000000000000000DF

:1001200000000000000000000000000000000000CF

:1001300000000000000000000000000000000000BF

:1001400000000000000000000000000000000000AF

:10015000000000000000000000000000000000009F

:10016000000000000000000000000000000000008F

:10017000000000000000000000000000000000007F

:10018000000000000000000000000000000000006F

:10019000000000000000000000000000000000005F

:1001A000000000000000000000000000000000004F

:1001B000000000000000000000000000000000003F

:1001C000000000000000000000000000000000002F

:1001D000000000000000000000000000000000001F

:1001E000000000000000000000000000000000000F

:1001F00000000000000000000000000000000000FF

:1002000000000000000000000000000000000000EE

:1002100000000000000000000000000000000000DE

:1002200000000000000000000000000000000000CE

:1002300000000000000000000000000000000000BE

:1002400000000000000000000000000000000000AE

:10025000000000000000000000000000000000009E

:10026000000000000000000000000000000000008E

:10027000000000000000000000000000000000007E

:10028000000000000000000000000000000000006E

:10029000000000000000000000000000000000005E

:1002A000000000000000000000000000000000004E

:1002B000000000000000000000000000000000003E

:1002C000000000000000000000000000000000002E

:1002D000000000000000000000000000000000001E

:1002E000000000000000000000000000000000000E

:1002F00000000000000000000000000000000000FE

:1003000000000000000000000000000000000000ED

:1003100000000000000000000000000000000000DD

:1003200000000000000000000000000000000000CD

:1003300000000000000000000000000000000000BD

:1003400000000000000000000000000000000000AD

:10035000000000000000000000000000000000009D

:10036000000000000000000000000000000000008D

:10037000000000000000000000000000000000007D

:10038000000000000000000000000000000000006D

:10039000000000000000000000000000000000005D

:1003A000000000000000000000000000000000004D

:1003B000000000000000000000000000000000003D

:1003C000000000000000000000000000000000002D

:1003D000000000000000000000000000000000001D

:1003E000000000000000000000000000000000000D

:1003F00000000000000000000000000000000000FD

:080400000000000000000000F4

:00000001FF

于是可以看到,keil将wireless这个struct结构体,放入rom中,【当然flag内容为0x88888888,其它1024字节将全部添0,所以这些非期望赋值的变量们[其值都是全0]将耗费掉n多rom空间,所以导致hex代码急剧膨胀,keil编译器可以完全不这样处理,将0x88888888放入RW区域,然后其余所有0值放入ZI区】,然后在跳转到Main之前,执行拷贝命令,将rom中存放的wireless结构体内容全部拷贝到g_wirless_ch1变量对应的内存地址处,所以,我们在keil中不应该对struct结构体做如上的静态赋值,尤其对只使用了struct中的某一个变量域的赋值,应该将对该变量的赋值,拉出来,放到一个函数中,单独赋值

转载地址:http://blog.sina.com.cn/s/blog_53d2a47a0100u88f.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: