Почему 1-символьная строка .NET 32 байта в x64? - PullRequest
7 голосов
/ 10 октября 2011

Я пытался выяснить издержки строки в .NET 4 x64.Это то, что я получил до сих пор.

  • 16-байтовый заголовок объекта для x64
  • 4 байта для поля stringLength (arrayLength отсутствует в .NET 4)
  • (длина + 1) * 2 байта для содержимого строки (UTF-16, завершено нулем)

Таким образом, можно ожидать, что строка из 1 символа будет 16 + 4 + 4 = 24 байта .Он делится на 8, поэтому не нуждается в заполнении.

Но когда я смотрю на размеры в WinDbg, я вижу, что они занимают 32 байта .Когда я !dumpobject говорю им, они говорят, что их размер составляет 28 байт, что, как я полагаю, округляется до 32. Что происходит?Есть ли еще один раунд выравнивания памяти?

Ответы [ 3 ]

7 голосов
/ 10 октября 2011

I подозревают , что первый символ выровнен по 8-байтовой границе в x64, поэтому при передаче в качестве указателя на неуправляемый код это правильно выровненный указатель. Ваши цифры, безусловно, совпадают с теми, что я недавно получил, измеряя размер строки , что приводит к формулам:

32 bit: 14 + length * 2 (rounded up to 4 bytes) 
64 bit: 26 + length * 2 (rounded up to 8 bytes)

Таким образом, по моим расчетам, в 64-битной CLR даже строка длиной 0 занимает 32 байта.

1 голос
/ 10 октября 2011

Округление до границ абзаца (16 байтов) для оптимизации заполнения строк кэша на процессорах Intel?

0 голосов
/ 10 октября 2011

Из того, что я понимаю, вы не можете полагаться ни на что на стороне реализации с .NET - просто потому, что это x байт на вашей машине, не означает, что это x байтов на какой-то другой версии для машины / .NET. то есть опасно делать что-либо в коде со знанием внутренней структуры структуры классов .NET.

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