Для работы вам понадобится ссылка на InteropServices:
то (в большинстве случаев) обнаружите, что структура занимает 12 байт. Причина кроется в том, что большинство процессоров лучше работает с данными, занимающими больше, чем байт, и выровненными по определенным адресным границам. Pentium предпочитает данные в блоках по 16 байт с выравниванием по адресным границам с размером, идентичным размеру самих данных. Например, 4-байтовый integer должен быть выровнен по границе 4 байта. Детальные подробности в данном случае неважны. Важно то, что компилятор добавит недостающие байты, чтобы выровнять данные внутри структуры. Вы можете контролировать это вручную, однако обратите внимание, что некоторые процессоры могут возвращать ошибку в случае использования невыровненных данных. Это создает дополнительные проблемы для пользователей .NET Compact Framework (интересно, много таких? прим. пер.).
Разумный ответ 8 байт, просто сумма размеров всех полей. Однако если вы попытаетесь узнать размер структуры:
В большинстве случаев вы можете описать и использовать структуру без знания о том, как она реализована особенно как расположены в памяти ее поля. Если вы должны создать структуру для использования ее другими приложениями, или сами должны использовать чужую структуру, то в этом случае вопросы памяти становятся важными. Как вы думаете, каков размер следующей структуры?
Множество техник, описанных в данной статье, могут быть расширены и применены к любым типам данных.
Структуры являются фундаментальными типами данных в C# и большинстве других современных языках программирования. По своей сути структуры просты, но вы можете удивиться, насколько быстро работа с ними может стать сложной. Чаще всего проблемы возникают, если вы должны работать со структурами, созданными в других языках и сохраненными на диске или полученными в результате вызова функций из библиотек или COM-объектов. В этой статье я подразумеваю, что вы знакомы с понятием структуры, умеете определять их и владеете базовыми навыками работы со структурами. Предполагается, что вы имеете представление о том, как вызывать API функции с использованием p/Invoke, а также что такое маршалинг. В случае неуверенности в своих знаниях вы можете обратиться к документации.
По следам недавнего топика представляю перевод упоминавшейся там статьи о структурах.
Работа со структурами в C# / Хабрахабр
Комментариев нет:
Отправить комментарий