Подтвердить что ты не робот

Tuple <int, int> versus int [2] использование памяти

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

4b9b3361

Ответ 1

Для 32-разрядного CLR оба будут иметь 4 байта для блокировки, 4 байта для дескриптора типа и 8 байтов для двух int. Однако массив будет иметь дополнительные 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 дополнительных байтов на измерение.

Литература:

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

Ответ 2

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