Когда использовать статические массивы против динамических массивов C - PullRequest
0 голосов
/ 07 января 2019

Я новичок в C, и мне просто интересно, есть ли ситуации, когда одно предпочтительнее другого, зависит ли оно только от предпочтения одного или есть одно, которое всегда лучше другого.

1 Ответ

0 голосов
/ 07 января 2019

Обратите внимание, что слово «static» имеет и другие значения в C. Похоже, вы спрашиваете о разнице между объявлением массива с постоянным размером, таким как int a[40], и объявлением массива с переменной длиной, например: int a[n], где n известно во время выполнения, но обычно не во время компиляции.

В этом случае общим правилом является использование статического размера, когда вы можете:

  • когда точный размер известен во время компиляции, или
  • , когда верхняя граница известна и использование верхней границы не будет тратить слишком много места.

Как правило, использование статического размера более эффективно, поскольку компилятор имеет больше информации и, следовательно, имеет больше возможностей для оптимизации. Когда компилятор компилирует операции с индексами адресов, он должен генерировать инструкции для вычисления адресов. Если ему известен размер массива, он может иметь возможность выполнять некоторые вычисления во время компиляции (например, для int a[40]; a[13] = 2; компилятор может рассчитать, что a[13] равно 13 • 4 = 52 байта с начала a (при условии, конечно, четырехбайтового int) или для включения размера массива в качестве непосредственного операнда в инструкции (имеется в виду, что он встроен в код и его не нужно искать в памяти или иным образом получать во время выполнения) .

Если компилятор не знает размер массива, он должен сгенерировать полный код для вычисления адресов во время работы программы. В современных типичных средах программирования это, как правило, невысокая стоимость, но это может быть соображением.

Кроме того, если массив имеет статический размер, он может быть внешним объектом (определенным вне какой-либо функции). Внешние объекты имеют статическую продолжительность хранения, что означает, что они существуют в течение всего времени работы запущенной программы. (Здесь «статический» используется в смысле «С», отличном от «фиксированного размера».) Когда компилятор знает размер массива, он может запланировать для него хранилище, которое предоставляется при запуске программы. Это позволяет массиву со статическим размером иметь статическую продолжительность хранения. Для массива с динамическим размером компиляторы обычно не могут планировать необходимое хранилище для них, поэтому они не могут быть внешними объектами.

...