Хранит ли CLR небольшие значения в «натуральных» размерах? - PullRequest
2 голосов
/ 29 марта 2010

В Java byte или short хранятся в «естественной» длине слова JVM, т. Е. Большей частью 32-битной. Исключением может быть массив байтов, где каждый байт занимает байт памяти.

CLR делает то же самое?

Если он делает , то в каких ситуациях есть исключения? Например. Сколько памяти это занимает?

struct MyStruct
{
    short s1;
    short s2;
}

Ответы [ 3 ]

3 голосов
/ 29 марта 2010

Хотя он на самом деле не предназначен для этой цели и может иногда давать несколько иные ответы (потому что он думает о вещах с точки зрения Marshalling, а не с точки зрения внутренних структур CLR), Marhsal.SizeOf может дать ответ:

System.Runtime.InteropServices.Marshal.SizeOf(typeof(MyStruct))

В этом случае он отвечает 4. (т. Е. Шорты хранятся как шорты). Обратите внимание, что это деталь реализации, поэтому на сегодняшний день нельзя полагаться на какой-либо ответ.

2 голосов
/ 29 марта 2010

Задачей компилятора JIT является назначение структуры памяти для классов и структур.Фактическая компоновка не может быть обнаружена никоим образом (кроме просмотра сгенерированного машинного кода), атрибут [StructLayout] необходим для маршалинга объекта в известную компоновку.JIT использует это, переупорядочивая поля, чтобы выровнять их и минимизировать размер выделения.

В приведенной вами структуре не будет сюрпризов, поля уже выровнены в любой текущей архитектуре ЦП, которая можетвыполнить управляемый код.Размер типов значений гарантируется CLI, короткое всегда занимает 16 бит.Ваша структура займет 32 бита.

1 голос
/ 29 марта 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...