2016-03-08 2 views
1

On MSDN Я прочитал это:памяти предел для структуры

ИЗБЕГАТЬ образующую структуры если тип не имеет все следующие характеристики: [...] Он имеет размер экземпляра по 16 байт.

На основании this post by Jon Skeet Я пришел к выводу, что использование памяти строк составляет не менее 20 байт.

Так что мне интересно, если создание структуры со строкой считается хорошей вещью или нет. Я знаю, что упомянутая статья о MSDN заявляет «избегать», а не «вы не должны». Сказав это, я не уверен , почему этот предел в 16 байт предлагается вообще.

+0

Строка является эталонным типом. Говоря о размере экземпляра 'struct', независимо от его размера, любая ссылка будет занимать 4 или 8 байт, в зависимости от архитектуры. – Groo

+0

http://stackoverflow.com/a/204009/659190 – Jodrell

+0

Дубликат не является macth Я предполагаю, что память не касается вообще. Дубликат обрабатывает только скорость – HimBromBeere

ответ

4

Строковые данные не живут внутри структуры. Структура хранит только 8-байтовую ссылку на объект (если на 64 бит).

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

Например, если вы в основном используете большие массивы таких структур и обращаетесь к элементам массива по ссылке, копирование не производится. Когда вы говорите bigArray[i].x++, это прямо изменяет x на место.


Субъективная примечание:

Я тоже не любитель обобщений, таких как тот, который вы привели. Я считаю, что понимание характеристик производительности более подробно позволяет полностью избавиться от таких простых правил. Но дело не в этом.

+2

Полная цитата заканчивается на * Во всех остальных случаях вы должны определить свои типы как классы. *, Так что это * should *, поэтому предложение более чем обязательное. Таким образом, обобщение, вероятно, хорошо. – xanatos

+0

@xanatos Как вы можете видеть мой последний абзац, я также упомянул об этом, поэтому я даже подумал, по какой причине они добавили это ограничение. – HimBromBeere

+0

Я думаю, что 'bigArray [i] .x ++' не будет компилироваться для structs. – HimBromBeere

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