【问题标题】:what is the point of having static arrays拥有静态数组有什么意义
【发布时间】:2012-02-12 16:33:56
【问题描述】:

我没有 C 或 C++ 的背景,所以静态数组让我有点困惑。它们是干什么用的?为什么它们被分配在堆栈上?

我想这会带来性能优势。堆栈分配更快,不需要垃圾收集。但是为什么需要在编译时知道长度呢?难道你不能在运行时创建一个固定大小的数组并在堆栈上分配它吗?

D 中的动态数组或切片由包含指针和长度属性的结构表示。静态数组也一样吗?它们是如何表示的?

如果你将它们传递给一个函数,它们会被完整地复制(除非你使用 ref),这背后的基本原理是什么?

我意识到动态数组和切片在 D 中比静态数组更重要,这就是为什么文档不会对它们进行很长时间的介绍,但我仍然希望了解更多背景知识。我猜静态数组的特性与堆栈分配的工作方式有关。

【问题讨论】:

    标签: d static-array


    【解决方案1】:

    静态数组来自 C 语言,由于内存泄漏(当您忘记释放分配的数组时)、双重释放(由于... )、悬空指针(GC可以避免手动内存管理的所有危险)

    这意味着诸如

    之类的结构
    int foo(char* inp){
        char[80] buff;
        strcpy(inp,buff);//don't do this this is a invite for a buffer overflow
        //...
        return 1;
    } 
    

    是常见的,而不是 alloc/free 调用,您需要确保在程序过程中分配的所有内容都被完全释放一次

    从技术上讲,您可以在堆栈上动态分配(如果您愿意,可以使用汇编)但这可能会导致代码出现一些问题,因为长度只会在运行时知道并减少编译器可能应用的优化(展开迭代例如)

    静态数组主要用于缓冲区,因为可以在堆栈上快速分配

    ubyte[1024] buff=void;//assigning void avoids the initializer for each element cause we are writing to it first thing anyway
    ubyte[] b;
    while((b=f.rawRead(buff[])).length>0){
         //...
    }
    

    它们可以隐式转换为数组的切片(或使用切片运算符[] 显式转换),因此您可以将它们与普通动态数组几乎互换使用

    【讨论】:

      【解决方案2】:

      静态数组是 D2 中的值类型。如果没有静态数组,就不会有简单的方法在一个结构中拥有 100 个实际存储在结构中的元素。

      静态数组将其大小作为其类型的一部分。这使您可以例如声明:alias ubyte[16] IPv6Address;

      与 C 不同,D2 静态数组是彻头彻尾的值类型。这意味着它们按值传递给函数,比如结构。就内存分配和复制而言,静态数组的行为通常类似于具有 N 个成员的结构。

      顺便说一句,您可以使用alloca 在堆栈上分配可变数量的内存。 C也有variable-length arrays

      【讨论】:

        猜你喜欢
        • 2018-02-23
        • 1970-01-01
        • 1970-01-01
        • 2010-11-13
        • 1970-01-01
        • 1970-01-01
        • 2023-03-31
        • 2011-10-23
        • 2017-07-16
        相关资源
        最近更新 更多