Почему syncblk находится в -4, а не в 0?

Поэтому, если вы хотите посмотреть на блок синхронизации для объекта, в разделе sos вы должны посмотреть на -4 байта (на 32-битных машинах) перед адресом объекта. Кто-нибудь знает, какова мудрость для возврата назад на 4 байта? Я имею в виду, что у них может быть блок синхронизации в 0, затем введите handle в +4 и затем поля объекта в +8.

2 ответа

Это подробности реализации, поэтому я не могу дать вам точную причину размещения синхронизирующего блока. Однако, если вы посмотрите на CLI с общим исходным кодом, вы увидите, что среда выполнения имеет все виды оптимизации того, как объекты распределяются и используются, и на самом деле данные, связанные с одним экземпляром, расположены в нескольких разных местах. Например, синхронизирующий блок - это просто значение индекса для структуры, расположенной в другом месте. Точно так же MethodTable и EEClass хранятся в другом месте. Это все детали реализации. Важным моментом IMO является понимание того, как выкопать информацию, необходимую во время отладки. Гораздо менее важно понять, почему детали реализации такие, какие они есть.

Я бы сказал, что это соответствует ожиданиям, особенно для структур, которые были четко изложены. Как говорит Брайан, это всего лишь деталь реализации. Это похоже на то, сколько реализаций malloc выделит больше места, чем запрошено, сохранит размер выделения в первых четырех (или восьми) байтах, а затем вернет указатель, который смещен, чтобы указывать на следующий байт после этого.

Другие вопросы по тегам