Chinaunix

标题: 请教一个数组初始化的问题~编译器相关~ [打印本页]

作者: superfight    时间: 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~
就是程序中有很多这样的数组定义~

想请教一下大家有没有编译选项能对这样的情况进行修正?~ 还是这样的初始化写法不正确?~
作者: prolj    时间: 2010-07-01 10:36
找powerpc-gcc-4.0的manul去,找vendor过来给你们解决,解决不了就boot之。
作者: hellioncu    时间: 2010-07-01 10:46
这种初始化没错,但是一般来说没有必要。
确实要初始化的自己memset一下算了
作者: chenzhanyiczy    时间: 2010-07-01 10:48
预留相当大的一段空间 ?? 预留的空间里面是什么?
作者: LinuxKen    时间: 2010-07-01 10:58
这种初始化没错,但是一般来说没有必要。
确实要初始化的自己memset一下算了
hellioncu 发表于 2010-07-01 10:46


类似:unsigned char test[100000] = {0}; 这样的初始化不具备可移植性;初始化还是用memset。
作者: superfight    时间: 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 没希望了~
作者: chenzhanyiczy    时间: 2010-07-01 11:16
我就觉得纳闷,这预留空间里面保存的是什么内容

10000860 <C.0.1268>:
        ...


作者: wmmy2008    时间: 2010-07-01 12:28
本帖最后由 wmmy2008 于 2010-07-01 12:29 编辑

i函数内定义的buf应该只是占用栈内存吧,,咋个会编到全局的 .rodata只读区去了......啥玩意....
作者: wmmy2008    时间: 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值时,编出来的可执行文件就会很大。
作者: masonzhang    时间: 2010-07-01 13:10
尝试下动态分配
作者: superfight    时间: 2010-07-01 15:18
换成powerpc-gcc-4.2.2就好了~

搞不明白~ = =a~




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2