`
qiezi
  • 浏览: 497751 次
  • 性别: 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;

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

相关推荐

    实验三存储器的分配及回收算法实现二维数组.doc

    实验过程中的代码实现和测试案例是验证算法功能和性能的关键,它们可以帮助理解内存分配和回收的逻辑,并分析不同算法的优劣。通过实验,学生可以深入理解内存管理的重要性和复杂性,以及如何通过编程实现这些算法。

    c++内存检测(防止堆栈错误)

    然而,手动跟踪所有内存分配是非常容易出错的,因此,使用智能指针(如`std::unique_ptr`、`std::shared_ptr`)可以帮助自动管理内存,避免泄漏。 另一种常见的错误是悬挂指针,即指针指向已释放的内存。释放内存后...

    D 语言编程参考手册 1[1].0(上).

    D语言提供了多种内存管理策略,包括写时复制(Copy-on-Write)、实时内存管理、平滑操作、自由链表、引用计数、显式类实例分配等。每种策略针对不同的场景,开发者可以根据实际需求选择最合适的内存管理方式。 ####...

    第4章-实验4-模拟先进先出(FIFO)页面置换算法1

    FIFO(First In First Out)页面置换算法是最简单的策略之一,其核心原则是按照页面进入内存的顺序进行淘汰,即最早进入内存的页面最先被替换。 **FIFO算法的置换策略:** 在FIFO算法中,当需要为新的页面分配内存...

    阿里巴巴2016研发工程师笔试题及答案(四).pdf

    第六题可能是关于内存管理的,选项D中的数字可能代表内存大小或者内存分配的百分比,与内存分配效率和内存管理策略有关。 第七题看起来是一个软件错误率统计的问题,ABug和BBug可能是不同类型的错误,选项D给出的...

    博研软件测试岗位面试题

    【面试题】: 面试题是评估求职者技能和知识的重要环节,...以上内容涵盖了软件测试面试中可能涉及的多个知识点,包括操作系统、编程基础、算法、测试策略以及逻辑推理。对于应聘者来说,掌握这些知识是成功面试的关键。

    C语言测试:想成为嵌入式程序员应知道的16个基本问题

    - 在面试中,对于系统调用和内存分配策略的了解,可以反映出应聘者对底层系统操作的理解程度,这对于在嵌入式系统开发中解决问题至关重要。 6. **其他重要知识点** - 数据类型:了解不同类型的大小、范围和使用...

    中国地质大学2010数据结构试卷及其答案.pdf

    8. 操作系统的内存管理:提到了`M1M2M310F11n1213AAM1BM1+M2CM3DM2+M3A2nBnlCnlDn`,这可能是在讨论多进程或线程环境下,不同内存区域的管理或内存分配策略。 9. 图算法的考查:提到了`ViVj,Vj&gt;,Vj&gt;`和`GDGViVjVjVi...

    2007年9月全国计算机等级考试二级C语言笔试试卷

    - 另外,还可能涉及到内存管理(如动态内存分配)、错误处理(如错误检测和调试技巧)以及预处理器(如宏定义)等内容。 2. **填空题**: - 填空题主要测试考生的实践操作能力,如编写代码片段来实现特定功能。...

    Problem D.rar_ACM_ACM试题

    6. **效率优化**:内存管理(如动态内存分配、堆栈溢出处理)、时间复杂度和空间复杂度分析、缓存优化、预处理技术等。 7. **编程语言**:虽然ACM竞赛不限定编程语言,但常见的是C++、Java和Python,理解这些语言的...

    C开发笔试题

    C语言的内存分配和对齐策略确实受到编译器和平台的影响,B描述正确。 这些题目覆盖了C语言的基础知识,包括变量定义、指针、位操作、条件判断、内存管理、数据结构和类型。理解这些知识点是成为一名熟练的C程序员的...

    腾讯2017校园招聘 软件测试岗笔试题(1).pdf

    1. 可重定位内存分配的目的是:解决碎片和紧缩问题。 2. 一个栈可以存储在一个数组中,可以使用头指针和尾指针来表示栈的开始和结束位置。 3. 快速排序双向链表的删除结点:可以使用头指针和尾指针来删除结点。 ...

    c99 to c89 可以编译的工程

    3. 变长数组:使用动态内存分配(`malloc`)代替,或者预先确定数组大小。 4. _Bool类型:替换为 `int` 类型,并用 `0` 和 `1` 表示假和真。 5. 静态局部变量:将其改为全局变量,但需注意避免命名冲突和数据安全...

    合并排序:一维数组上的排序算法的C实现

    在C语言中,我们可以使用指针和动态内存分配来处理数组。以下是一个简单的C语言实现: ```c #include #include // 合并两个已排序的子数组 void merge(int* arr, int l, int m, int r) { int i, j, k; int n1 ...

    07年9月C++等考真题

    例如,选择题可能涉及到C++的内存管理(如动态内存分配),控制流程(如条件判断和循环),函数调用,指针操作,以及面向对象编程的概念(如继承、多态和封装)。其中,D选项可能涉及指针的使用,B选项可能考察了...

    阿尔卡特 朗讯 笔试题集锦

    - 可以使用静态内存分配(如全局变量、局部变量)、堆内存分配(如malloc/calloc/free)以及栈内存分配。 17. **头文件保护**: - 使用预处理器指令`#ifndef/#define/#endif`可以防止头文件被多次包含。 18. **...

Global site tag (gtag.js) - Google Analytics