免费注册 查看新帖 |

Chinaunix

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

请教数组在栈上的实际内存占用 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-05-04 11:37 |只看该作者 |倒序浏览
遇到的问题,直接见代码
  1. void vFunc()
  2. {
  3.     char *s1="hello";
  4.     char s2[]="world";

  5. return;
  6. }
复制代码
gcc -S 之后
  1. .LC0:
  2.         .string "hello"
  3. .LC1:
  4.         .string "world"
  5.         .text
  6. .globl vFunc
  7.         .type   vFunc,@function
  8. vFunc:
  9.         pushl   %ebp
  10.         movl    %esp, %ebp
  11.         subl    $40, %esp
  12.         movl    $.LC0, -12(%ebp)
  13.         movl    .LC1, %eax
  14.         movl    %eax, -40(%ebp)
  15.         movw    .LC1+4, %ax
  16.         movw    %ax, -36(%ebp)
  17.         leave
  18.         ret
  19. .Lfe1:
  20.         .size   vFunc,.Lfe1-vFunc
复制代码
想问下为啥,压入的是40B而不是4+6+2的呢?
数组占用的实际空间到底是多少呢?数组名称有没有占用空间呢?
迷惑啊!

论坛徽章:
0
2 [报告]
发表于 2010-05-04 12:15 |只看该作者
movl: worl
movw:d\o

论坛徽章:
0
3 [报告]
发表于 2010-05-04 12:32 |只看该作者
你用-O2优化之后再看看。

论坛徽章:
0
4 [报告]
发表于 2010-05-04 12:41 |只看该作者
这不是该你关心的。你真认为这很重要,那么你应该扔掉编译器,直接写汇编代码。

论坛徽章:
0
5 [报告]
发表于 2010-05-04 12:47 |只看该作者
movl: worl
movw:d\o
huangwei0413 发表于 2010-05-04 12:15



    这个我了解。
一个指针占 4B
一个数组占6B
加上对齐啊啥的 一共应该占12B吧。
为啥它要压入40B呢?

哪个环节占用了额外的内存呢?
请大侠指教啊。。。。。。。。

论坛徽章:
0
6 [报告]
发表于 2010-05-04 12:53 |只看该作者
这不是该你关心的。你真认为这很重要,那么你应该扔掉编译器,直接写汇编代码。
langue 发表于 2010-05-04 12:41



    qq面试的时候问的:一个数组除了申明的空间外,是否还额外占有其他的空间?
   我答:再搞个指针,指向这个数组?但在栈上,没必要搞指针了呀。但今天试了一下,发现的确多出来不少字节啊。

补充,经过测试:
   如果函数中只有那个指针,那只压入4B;
             只有那个数组,只压入了24B;

搞的我很迷惑啊。还是希望知情者告知,或者给我点思路。

论坛徽章:
0
7 [报告]
发表于 2010-05-04 12:57 |只看该作者
"hello"还有"world"这2个字符串是硬编码的,是常量,是放在一个的rodata这样的内存区里的。
LC0是hello,LC1是"world".

movl    $.LC0, -12(%ebp) 这里-12(%ebp)就是char *s1

         movl    .LC1, %eax
         movl    %eax, -40(%ebp)
这2句就是把'w','o','r','l'4个字符送到送到-40(%ebp)里去,而-40(%ebp)就是char s2[]
         movw    .LC1+4, %ax
         movw    %ax, -36(%ebp)
这2句就是把'd','\0'2个连续字符送到-36(%ebp)里
编译器最后的生成的代码里,会去掉变量名这种东西的。编译器不会给变量名啥的分配空间
至于为什么%esp-40,这个不清楚了。这个应该是编译器自己的事,得问问GCC的开发人员了。起码VC的就不是-40.

论坛徽章:
0
8 [报告]
发表于 2010-05-04 12:58 |只看该作者
回复 5# liklone


    多余的字节应该是栈保护

论坛徽章:
0
9 [报告]
发表于 2010-05-04 13:02 |只看该作者
回复 6# liklone

这样的问题没有标准答案,实际情况取决于编译器的处理,甚至有可能实际分配的字节数少于数组定义的大小。

论坛徽章:
0
10 [报告]
发表于 2010-05-04 13:29 |只看该作者
你用-O2优化之后再看看。
没本 发表于 2010-05-04 12:32



    结果一样的呀!
并且发现,栈的最后一个字是0xB88A9400;
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP