2010-09-27 3 views
9

Это 12 байт или 16 байтов при хранении в List<DataPoint>?Какой размер этой структуры C#?

public struct DataPoint 
{ 
    DateTime time_utc; 
    float value; 
} 

Есть ли функция размераof в C#?

+0

Надеюсь, вы знаете, что каждый экземпляр этой структуры будет помещен в коробку, когда будет помещен в список, поэтому добавьте пространство для указателя. – 2010-09-27 14:19:04

+6

@ToxicAvenger: он будет * не * быть помещен в коробку, когда вы помещаете его в 'Список '. Однако он будет помещен в 'ArrayList' или' List '. – Ruben

+0

Это более конкретный, но, возможно, дубликат http://stackoverflow.com/questions/3361986/how-to-check-the-number-of-bytes-consumed-by-my-strucure –

ответ

14

Посмотрите на ответ @Hans Passant here для интересного фона по этой проблеме, особенно. в отношении ограничений Marshal.Sizeof.

+8

Да, хороший ответ :) –

8
+1

Вы можете добавить решение на его вопрос: 16 байт (8 байт + 4 байта + выравнивание 4 байта) – Scoregraphic

+3

Маршал.SizeOf() делает * not * возвращает размер управляемой структуры, а только неуправляемую версию. Проверьте ответ Стива. –

2

Это будет 12 байт (4 для поплавка, 8 для DateTime); Marshal.SizeOf вернет 16, потому что упаковка по умолчанию составляет 8 байт. This - хорошая статья о структурах и упаковке. Он дает полное описание того, что происходит на самом деле.

6

CLR может свободно размещать типы в памяти по своему усмотрению. Таким образом, невозможно напрямую присвоить размер.

Однако, для структур, то можно ограничить свободу CLR с помощью StructLayout Attribute:

  • Auto: среда автоматически выбирает соответствующий макет.
  • Последовательный: Элементы объекта выложены последовательно и выровнены в соответствии с StructLayoutAttribute.Pack значение.
  • Explicit: Точное положение каждого элемента явно контролируется.

C# компилятор автоматически применяет макет вида Последовательное к любой структуре. Значение Pack по умолчанию равно 4 или 8 на машинах x86 или x64 соответственно. Таким образом, размер вашей структуры равен 8 + 4 = 12 (как x86, так и x64).


Unrelated от того, как тип выложена в памяти, это также можно маршалу типа в .NET с использованием Marshal Class. Маршаллер применяет несколько преобразований при сортировке типа, поэтому результат не всегда совпадает с тем, как CLR выложил тип. (Например, bool занимает 1 байт в памяти плюс выравнивание, в то время как маршаллеры маршалируют bool до 4 байтов.)

+0

Обратите внимание, что с инструкцией IL 'sizeof' можно получить« окончательный »размер CLR для структуры, учитывая отступы и любые другие операции выравнивания. См. [Мой пост в блоге] (http://lastyearswishes.com/blog/view/50a30d3bd1f1a5234323b198) о том, как использовать его и больше различий (примечание: я написал библиотеку-оболочку, которую можно вызывать из C#) – Earlz

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