Где хранится массив, инициализированный списком инициализаторов? - PullRequest
5 голосов
/ 25 января 2009

Учитывая этот кусок кода:

(void)someFunction(void) {
    int array[] = {1,2,3,4,5,6,7,8,9,10};
}

Где хранятся значения массива?

  • Stack
  • Heap
  • Вместе с этими строковыми литералами. (Это называется высокочастотная куча?)
  • Где-то еще?

Я спрашиваю, потому что я не уверен в этом вопросе:

Создать массив целочисленных свойств в target-c

Ответы [ 3 ]

9 голосов
/ 25 января 2009

Сам массив будет в стеке. При входе в функцию будет немного кода, который копирует значения, хранящиеся в каком-либо неназванном массиве в области глобальной / статической памяти, в локальный массив стека. Вероятно, что безымянный глобальный / статический массив с начальными значениями находится в той же области общей памяти, что и строковые литералы.

Обратите внимание, что стандарт не требует ничего из этого - но в значительной степени это будет реализовывать любой компилятор. Достаточно умный компилятор может заметить, что значения являются просто инкрементными целочисленными значениями, и может создать цикл для инициализации локального массива

(этот ответ предполагает C / C ++ - я не знаю, изменит ли Objective-C что-либо из этого).

1 голос
/ 25 января 2009

Как сказал Майкл, где будут храниться значения списка инициализатора, зависит от компилятора и уровней оптимизации. Например, gcc без оптимизации просто сгенерирует код для перемещения констант в соответствующие места в массиве, то есть фактические значения будут храниться только в самом коде. Вы можете легко проверить, что произойдет, если вы не скомпилируете объектный код, а вместо этого разрешите вашему компилятору выводить ассемблер.

0 голосов
/ 05 ноября 2010

Если кто-то читает это на C #, ответ будет другим. Массивы являются ссылочными типами, поэтому значения хранятся в куче и упоминаются в стеке.

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