`
qiezi
  • 浏览: 491510 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

从简单测试看D数组内存分配策略

    博客分类:
  • D
阅读更多
D语言动态数组可以在运行期改变大小,这和C++的vector相似。似乎记得“STL源码分析”一书中提到vector的内存分配策略是倍增方式的,D语言数组是不是也使用了相同方式呢?我做了个简单的测试:

void main(){
        void* ptr = null;
        int[] arr = new int[0];
        for (int i=0; i<33; ++i){
                void* cur = cast(void*)arr;
                if (cur != ptr){
                        writefln(i);
                        ptr = cur;
                }
                arr ~= 0;
        }

        writefln("=================");

        while (arr.length){
                void* cur = cast(void*)arr;
                if (cur != ptr){
                        writefln(arr.length);
                        ptr = cur;
                }
                arr.length = arr.length - 1;
        }
}

上面的代码先是在数组中加入元素,如果数组地址发生变化,则表明内在已经重新分配了。然后是删除元素,改变数组的长度就可以做到。

运行结果如下:
1
4
8
16
32
=================

基本可以确定它是使用了倍增的分配策略,而删除元素时并不重新分配空间(这也是预期的)。

我们知道这种分配策略是会拷贝数组元素的,如果要减少这种拷贝,就需要在创建数组时分配足够的空间。如何分配一个可以容纳1024个元素的空间,但它的长度却为0?

由于D的文档经常悄悄地添加一些东西,所以我重新看了一下D语言文档数组部分,以防有新的做法是我没有看到的,不过并没有找到这种直接的做法(如果你的到了请告诉我,谢谢)。

根据上面的测试代码,最合理的一种做法大概是:
int[] arr = new int[1024];
arr.length = 0;

然后进行数组元素的添加操作,不会引起内在的重新分配。
分享到:
评论

相关推荐

    Java虚拟机

    第3章 垃圾收集器与内存分配策略 3.1 概述 3.2 对象已死吗 3.2.1 引用计数算法 3.2.2 可达性分析算法 3.2.3 再谈引用 3.2.4 生存还是死亡 3.2.5 回收方法区 3.3 垃圾收集算法 3.3.1 标记-清除算法 3.3.2 ...

    c++ 面试题 总结

    当程序运行时需要从内存中读出这段程序的代码。代码的位置必须在物理内存中才能被运行,由于现在的操作系统中有非常多的程序运行着,内存中不能够完全放下,所以引出了虚拟内存的概念。把哪些不常用的程序片断就放入...

    超级有影响力霸气的Java面试题大全文档

    从内存方面来看, Stateful Session Bean 与 Stateless Session Bean 比较, Stateful Session Bean 会消耗 J2EE Server 较多的内存,然而 Stateful Session Bean 的优势却在于他可以维持使用者的状态。 12、...

    Visual.Basic.2010.&.NET4.高级编程(第6版)-文字版.pdf

    4.5.2 更快地为对象分配内存 230 4.5.3 垃圾回收器的优化 231 4.6 名称空间 232 4.6.1 名称空间的概念 233 4.6.2 名称空间与引用 236 4.6.3 常用的名称空间 237 4.6.4 导入名称空间并指定别名 239 ...

    MySQL 5.1参考手册 (中文版)

    5.9.2. 示例用备份与恢复策略 5.9.3. 自动恢复 5.9.4. 表维护和崩溃恢复 5.9.5. myisamchk:MyISAM表维护实用工具 5.9.6. 建立表维护计划 5.9.7. 获取关于表的信息 5.10. MySQL本地化和国际应用 5.10.1. 数据和排序...

    mysql官方中文参考手册

    5.9.2. 示例用备份与恢复策略 5.9.3. 自动恢复 5.9.4. 表维护和崩溃恢复 5.9.5. myisamchk:MyISAM表维护实用工具 5.9.6. 建立表维护计划 5.9.7. 获取关于表的信息 5.10. MySQL本地化和国际应用 5.10.1. 数据和排序...

    MYSQL中文手册

    5.9.2. 示例用备份与恢复策略 5.9.3. 自动恢复 5.9.4. 表维护和崩溃恢复 5.9.5. myisamchk:MyISAM表维护实用工具 5.9.6. 建立表维护计划 5.9.7. 获取关于表的信息 5.10. MySQL本地化和国际应用 5.10.1. 数据...

    MySQL 5.1参考手册中文版

    5.9.2. 示例用备份与恢复策略 5.9.3. 自动恢复 5.9.4. 表维护和崩溃恢复 5.9.5. myisamchk:MyISAM表维护实用工具 5.9.6. 建立表维护计划 5.9.7. 获取关于表的信息 5.10. MySQL本地化和国际应用 5.10.1. 数据...

    MySQL 5.1参考手册

    5.9.2. 示例用备份与恢复策略 5.9.3. 自动恢复 5.9.4. 表维护和崩溃恢复 5.9.5. myisamchk:MyISAM表维护实用工具 5.9.6. 建立表维护计划 5.9.7. 获取关于表的信息 5.10. MySQL本地化和国际应用 5.10.1. 数据和排序...

    java 面试题 总结

    从内存方面来看, Stateful Session Bean 与 Stateless Session Bean 比较, Stateful Session Bean 会消耗 J2EE Server 较多的内存,然而 Stateful Session Bean 的优势却在于他可以维持使用者的状态。 9、...

    MySQL5.1参考手册官方简体中文版

    5.9.2. 示例用备份与恢复策略 5.9.3. 自动恢复 5.9.4. 表维护和崩溃恢复 5.9.5. myisamchk:MyISAM表维护实用工具 5.9.6. 建立表维护计划 5.9.7. 获取关于表的信息 5.10. MySQL本地化和国际应用 5.10.1. 数据和排序...

    MySQL 5.1官方简体中文参考手册

    5.9.2. 示例用备份与恢复策略 5.9.3. 自动恢复 5.9.4. 表维护和崩溃恢复 5.9.5. myisamchk:MyISAM表维护实用工具 5.9.6. 建立表维护计划 5.9.7. 获取关于表的信息 5.10. MySQL本地化和国际应用 5.10.1. 数据和排序...

    mysql5.1中文手册

    示例用备份与恢复策略 5.9.3. 自动恢复 5.9.4. 表维护和崩溃恢复 5.9.5. myisamchk:MyISAM表维护实用工具 5.9.6. 建立表维护计划 5.9.7. 获取关于表的信息 5.10. MySQL本地化和国际应用 ...

    大量批处理实用程序例程

    去最大最小值后求剩余数组平均值.cmd 对数字进行排序.cmd 把一个数拆分为几个数的和.cmd 无限制实数加减运算脚本.cmd 水仙花数算法.cmd 求一列数所有不同组合的和.cmd 求最大公约数和最小公倍数.cmd 用随机数做四则...

Global site tag (gtag.js) - Google Analytics