2012-03-12 3 views
0

У меня есть массив размером 20 на 10, состоящий из двухместных и коротких строк (менее 15 символов каждый). Этот массив используется только внутри функции при ее вызове. Строки постоянны, только удваиваются.Должен ли я сделать большой массив локальным?

Должен ли я оставить этот массив локальным для функции? Любое соображение, о котором я не знаю?

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

+2

Не могли бы вы вывести код? Должно помочь нам дать вам направление. – NickHeidke

+1

У вас возникли проблемы с этой настройкой? – Oded

+0

У вас есть массив из нескольких типов? –

ответ

4

Вы просто не можете иметь локальный экземпляр массива.

Массивы являются ссылочными типами, поэтому фактическая память всегда выделяется на кучу.

Итак: Да, сохраните переменную типа reference-to-an local, если это соответствует ее использованию. И это делает:

Этот массив используется только внутри функции

+0

Если вы * действительно нуждаетесь в локальном массиве, для этого используется 'stackalloc'. Я еще не видел места, где это было необходимо. Весь BCL использует его только в нескольких десятках классов. – Gabe

+0

@Gabe - Верно, но действительно настолько экзотично, что я решил проигнорировать его. –

+1

Это своего рода расщепляющиеся волосы; это не C++, вы вообще никогда не «указываете» на ранее существовавшее место кучи, не имея и не копируя ссылку, которую вы получили, когда создали ее. Таким образом, если вы объявляете переменную в методе, выходящем за пределы области действия при выходе метода, с точки зрения разработчика это «локально», независимо от того, где выделена память. Даже локальные типы значений могут быть помещены в кучу; решение поместить их в стек - это деталь реализации CLR, которая не всегда верна. – KeithS

2

Я бы не стал слишком беспокоиться о вещах, если вы не очень беспокоитесь об использовании памяти (что в наши дни не так уж и много).

3

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

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

Это действительно зависит от вас; мы не можем сказать из вашего вопроса, какие у вас могут быть проблемы с этим кодом, который может указывать на изменение или изменение его.

2

В настоящее время локальная переменная создается при каждом вызове.

Если вы поместили переменную массива и объявили ее вне функции, она не начнет с нулевых значений для double s, и вам нужно будет очистить ее, прежде чем вы сможете ее использовать.

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

Смежные вопросы