какой смысл иметь статические массивы - PullRequest
4 голосов
/ 12 февраля 2012

У меня нет фона в C или C ++, поэтому статические массивы меня немного озадачивают.Для чего они?Почему они расположены в стеке?

Я полагаю, что выигрыш в производительности.Распределение стека происходит быстрее, и сбор мусора не требуется.Но почему длина должна быть известна во время компиляции?Не могли бы вы создать массив фиксированного размера во время выполнения и выделить его в стеке?

Динамические массивы или срезы в D представлены структурой, содержащей указатель и свойство length.То же самое верно для статических массивов?Как они представлены?

Если вы передадите их в функцию, они будут скопированы полностью (если вы не используете ref), в чем причина этого?и срезы гораздо важнее в D, чем статические массивы, поэтому документация не останавливается на них очень долго, но я все же хотел бы иметь немного больше информации.Я предполагаю, что особенности статических массивов связаны с тем, как работает распределение стека.

Ответы [ 2 ]

6 голосов
/ 12 февраля 2012

статические массивы родом из языка 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){
     //...
}

они могут неявно преобразовывать в фрагмент массива (или eявно с оператором среза []), чтобы вы могли использовать их почти взаимозаменяемо с обычными динамическими массивами

5 голосов
/ 12 февраля 2012

Статические массивы типы значений в D2. Без статических массивов не было бы простого способа иметь 100 элементов в структуре, которые фактически хранятся в структуре.

Статические массивы несут свой размер как часть своего типа. Это позволяет вам, например, объявить: alias ubyte[16] IPv6Address;

В отличие от C, статические массивы D2 являются типами значений насквозь. Это означает, что они передаются по значению функциям, подобно структурам. Статические массивы, как правило, ведут себя как структуры с N элементами в распределении памяти и копировании.

Кстати, вы можете использовать alloca, чтобы выделить переменное количество памяти в стеке. C также имеет массивы переменной длины .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...