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