D 使用静态数组有什么意义 我没有C或C++背景,所以静态数组有点让我费解。它们是干什么用的?为什么在堆栈上分配它们

D 使用静态数组有什么意义 我没有C或C++背景,所以静态数组有点让我费解。它们是干什么用的?为什么在堆栈上分配它们,d,static-array,D,Static Array,我想这对性能有好处。堆栈分配更快,并且不需要垃圾收集。但是为什么需要在编译时知道长度呢?您不能在运行时创建一个固定大小的数组并在堆栈上分配它吗 D中的动态数组或切片由包含指针和长度属性的结构表示。对于静态数组也是这样吗?他们是如何代表的 如果您将它们传递给一个函数,它们将被完整复制(除非您使用ref),这背后的原理是什么 我意识到动态数组和切片在D中比静态数组重要得多,这就是为什么文档没有详细介绍它们的原因,但我仍然希望有更多的背景知识。我猜静态数组的特性与堆栈分配的工作方式有关。静态数组起源于

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

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

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


我意识到动态数组和切片在D中比静态数组重要得多,这就是为什么文档没有详细介绍它们的原因,但我仍然希望有更多的背景知识。我猜静态数组的特性与堆栈分配的工作方式有关。

静态数组起源于C语言,在C语言中,由于内存泄漏(当您忘记释放分配的数组时)、双重释放(由于…)和悬空指针,对(缓慢的)
alloc
的调用被极力阻止(使用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){
     //...
}

它们可以隐式地转换为数组的切片(或显式地使用切片运算符
[]
)因此,您可以将它们与D2中的常规动态数组几乎互换使用。静态数组在D2中是值类型。没有静态数组,就没有简单的方法在结构中包含100个实际存储在结构中的元素

静态数组将其大小作为其类型的一部分。这允许您声明:
alias ubyte[16]ipv6地址;

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

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