免费注册 查看新帖 |

Chinaunix

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

请教c99变长数组如何分配内存? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-18 22:35 |只看该作者 |倒序浏览
请教一下c99的变长数组如何申请内存,变长数组作为局部变量应该还是存在stack里面的是吧? 那当那个变量确定以后他是怎么变的呢?把栈里边他之后的数都往上移动,再扩充?那不是超级慢的?

谢谢。

论坛徽章:
0
2 [报告]
发表于 2009-06-18 23:49 |只看该作者
不过是一个 esp 减 XX 值的计算,和一般的局部变量分配过程是一样的。效率上没啥影响。

void foo(int i)
{
        int s;
        ... ...
}

像上面这个变长数组,原理是很简单的

esp - i * sizeof(int)  就等于分配了变长数组空间。


但是,gcc 还要考虑 stack 边界对齐的问题。默认下是 16 bytes 边界对齐


上面的代码 gcc 处理为:

        leaq    30(,%rdi,4), %rdi                        /*    i * sizeof(int)     */
        andq    $-16, %rdi
        subq    %rdi, %rsp
        leaq    15(%rsp), %rax
        andq    $-16, %rax

-----------------------------------------------

        leaq    30(,%rdi,4), %rdi                       
        andq    $-16, %rdi

这两句的结果是:如果 i = 0x02   则调整为 i = 0x08 + 0x0f + 0x0f & 0xF0 = 0x20
与 rsp 相减后

        leaq    15(%rsp), %rax
        andq    $-16, %rax

再调整到下个 16 bytes 边界上。

[ 本帖最后由 mik 于 2009-6-19 00:01 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2009-06-19 23:26 |只看该作者
还有点不明白。那如果有多个变长数组呢?数组之间不是叠在一起的吗?移定下面的长度时不就要移动上面的数组了么?

论坛徽章:
0
4 [报告]
发表于 2009-06-20 17:45 |只看该作者
学习~

论坛徽章:
0
5 [报告]
发表于 2009-06-20 21:59 |只看该作者
我只能说,在某种IR中,栈空间是显式分配和释放的,具体到实现,如果是多个变长数组,就是模拟realloc。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP