免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4291 | 回复: 10
打印 上一主题 下一主题

请教一个数组初始化的问题~编译器相关~ [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-07-01 10:25 |只看该作者 |倒序浏览
在函数内写了一个 unsigned char test[100000] = {0};

使用不同的3个编译器进行编译~

1.powerpc-gcc-4.0  编译出来后会在rodata段预留相当大的一段空间~ 导致程序变大
2.powerpc-gcc-2.95.3  编译出来后不会在rodata段预留空间
3.gcc-3.2.2  编译出来之后不会在rodata段预留空间

现在把项目从powerpc-gcc-2.95.3迁移到powerpc-gcc-4.0后~ 编译出来的文件从原来的600K变成了8MB~
就是程序中有很多这样的数组定义~

想请教一下大家有没有编译选项能对这样的情况进行修正?~ 还是这样的初始化写法不正确?~

论坛徽章:
0
2 [报告]
发表于 2010-07-01 10:36 |只看该作者
找powerpc-gcc-4.0的manul去,找vendor过来给你们解决,解决不了就boot之。

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
3 [报告]
发表于 2010-07-01 10:46 |只看该作者
这种初始化没错,但是一般来说没有必要。
确实要初始化的自己memset一下算了

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
4 [报告]
发表于 2010-07-01 10:48 |只看该作者
预留相当大的一段空间 ?? 预留的空间里面是什么?

论坛徽章:
0
5 [报告]
发表于 2010-07-01 10:58 |只看该作者
这种初始化没错,但是一般来说没有必要。
确实要初始化的自己memset一下算了
hellioncu 发表于 2010-07-01 10:46


类似:unsigned char test[100000] = {0}; 这样的初始化不具备可移植性;初始化还是用memset。

论坛徽章:
0
6 [报告]
发表于 2010-07-01 11:00 |只看该作者
objdump来看的话就是

Disassembly of section .rodata:

1000084c <_IO_stdin_used-0x10>:
1000084c:        10 11 29 6c         vsldoi  v0,v17,v5,5
10000850:        10 00 04 38         .long 0x10000438
10000854:        10 00 04 c0         .long 0x100004c0
10000858:        10 00 05 4c         .long 0x1000054c

1000085c <_IO_stdin_used>:
1000085c:        00 02 00 01         .long 0x20001

10000860 <C.0.1268>:
        ...
Disassembly of section .eh_frame:

100fa860 <__FRAME_END__>:

就是这个C.0.1268

= {0} 感觉这样写比memest简洁~ 效率也高点吧~

这个powerpc-gcc-4.0是uboot的ELDK开发包~ Orz~ 我自己觉得应该没啥大问题
连P姨都这样说 T ^T 没希望了~

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
7 [报告]
发表于 2010-07-01 11:16 |只看该作者
我就觉得纳闷,这预留空间里面保存的是什么内容

10000860 <C.0.1268>:
        ...

论坛徽章:
0
8 [报告]
发表于 2010-07-01 12:28 |只看该作者
本帖最后由 wmmy2008 于 2010-07-01 12:29 编辑

i函数内定义的buf应该只是占用栈内存吧,,咋个会编到全局的 .rodata只读区去了......啥玩意....

论坛徽章:
0
9 [报告]
发表于 2010-07-01 13:07 |只看该作者
本帖最后由 wmmy2008 于 2010-07-01 13:09 编辑

const char test1[100000]={0};
char test2[100000] = {1};
char test3[100000]= {0};

定义了三个全局数组,,在X86下用GCC 汇编出来的代码:
.globl test1
        .section        .rodata
        .align 32
        .type   test1, @object
        .size   test1, 100000
test1:
        .zero   100000
.globl test2
        .data
        .align 32
        .type   test2, @object
        .size   test2, 100000
test2:
        .byte   1
        .zero   99999
.globl test3
        .bss
        .align 32
        .type   test3, @object
        .size   test3, 100000
test3:   
        .zero   100000

可以看出test1,test2,test3分别在全局内存的 .rodata段,.data段和.bss段 。。。在编译成可执行文件时,可以看出 .rodata段和.data段的变量既要占用文件空间又要占用运行是空间。
而.bss段的变量不会占用文件的空间。。所以说如果定义一个很大的全局数组并且初始化为一个非0值时,编出来的可执行文件就会很大。

论坛徽章:
0
10 [报告]
发表于 2010-07-01 13:10 |只看该作者
尝试下动态分配
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP