Кто-нибудь знает разницу в памяти между этими двумя? Или как можно легко понять это?
Tuple <int, int> versus int [2] использование памяти
Ответ 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 дополнительных байтов на измерение.
Литература:
- http://www.codeproject.com/KB/dotnet/arrays.aspx
- http://www.codeproject.com/KB/cs/net_type_internals.aspx?fid=459323&df=90&mpp=25&noise=3&sort=Position&view=Quick&select=2567811
- http://msdn.microsoft.com/en-us/magazine/cc301755.aspx
* Вы не можете объявить массив с нижней границей в С#, поэтому я составил синтаксис 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
.