Я должен был сначала измерить это вместо того, чтобы пытаться рассуждать и размышлять. Мои измерения показывают, что в .NET4 x86 CLR int [2] потребляет только ~ 20% больше памяти, чем Tuple <int, int>, в соответствии с вашим ответом.

ибудь знает разницу в памяти между этими двумя? Или как бы самим это легко понять?

Ответы на вопрос(2)

Tuple<int, int> использует ту же память, что и класс, с двумя целочисленными полями. Массив, с другой стороны, имеет довольно большую внутреннюю структуру данных (называемуюrrayOpScript вSSCLI) по крайней мере 32 байта плюс другая структура данных (называемаяrrayOpIndexSpec) для каждого ранга (в данном случае одного) размером 16 байт. Таким образом, массив почти наверняка использует несколько факторов больше памяти, чемTuple.

 Rick Sladkey13 янв. 2011 г., 05:24
Я должен был сначала измерить это вместо того, чтобы пытаться рассуждать и размышлять. Мои измерения показывают, что в .NET4 x86 CLR int [2] потребляет только ~ 20% больше памяти, чем Tuple <int, int>, в соответствии с вашим ответом.
 Gabe13 янв. 2011 г., 04:41
Мое профилирование на .Net 4 CLR показывает, что даже многомерный массив всего на 20 или 24 байта больше, чем класс 2-int.
Решение Вопроса

4 байта для дескриптора типа и 8 байтов для двух целых. Массив, однако, будет иметь дополнительные 4 байта для хранения длины (2 в данном случае), поэтому массив будет иметь 4 байта служебной информации.

Размеры (определяются по профилированию) на 32-битных:
Tuple<int, int>: 16 байт
int[2]: 20 байт
int[1 to 2]*: 28 байт
int[2, 1]: 36 байт
На 64-битном CLR:
Tuple<int, int>: 24 байта
int[2]: 32 байта
int[1 to 2]*: 40 байт
int[2, 1]: 48 байт

Обратите внимание, что одномерные массивы с нулевым типом значений являются наименьшими возможными массивами. Использование ссылочных типов добавляет еще 4 байта для типа хранимого объекта (8 байтов на 64-битной). Использование ненулевых оснований массива или нескольких измерений позволяет использовать другой тип массива, в котором хранится информация о ранге и нижней границе, добавляя 8 дополнительных байтов на измерение.

Рекомендации:

http://www.codeproject.com/KB/dotnet/arrays.aspxhttp://www.codeproject.com/KB/cs/net_type_internals.aspx?fid=459323&df=90&mpp=25&noise=3&sort=Position&view=Quick&select=2567811http://msdn.microsoft.com/en-us/magazine/cc301755.aspx

* Вы не можете объявить массив с ненулевой нижней границей в C #, поэтому я составил синтаксисint[1 to 2], Вы можете, однако, позвонитьArray.CreateInstance(typeof(int), new[]{2}, new[]{10}); создать массив с 2 элементами с индексами 10 и 11. Конечно, поскольку такие массивы нельзя представить непосредственно в системе типов C #, они не очень полезны, но они предоставляют интересную точку данных.

 Rick Sladkey13 янв. 2011 г., 04:26
Массивы - это особый случай, даже оптимизированный для IL, и поэтому они имеют дополнительные издержки в самом CLI.

Ваш ответ на вопрос