有静态数组有什么意义呢

fwe*_*end 4 d static-array

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

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

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

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

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

rat*_*eak 6

静态数组来自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;
} 
Run Code Online (Sandbox Code Playgroud)

是常见的,而不是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){
     //...
}
Run Code Online (Sandbox Code Playgroud)

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


Vla*_*eev 5

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

静态数组的大小是其类型的一部分.这允许您例如声明:alias ubyte[16] IPv6Address;

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

顺便说一句,您可以使用alloca在堆栈上分配可变数量的内存.C也有可变长度数组.