Да, все гарантированно будет правильно выровнено, если только вы не намеренно стараетесь излишне выровнять вещи, что означает, что присвоение / чтение ссылок гарантированно будет атомарным.
Раздел 12.6.6 спецификации CLIпродолжает:
Если явное управление макетом (см. Раздел II (Управление макетом экземпляра)) не используется для изменения поведения по умолчанию, элементы данных не превышают естественный размер слова (размерnative int
) должны быть правильно выровнены.Ссылки на объекты должны обрабатываться так, как если бы они хранились в собственном размере слова.
Более подробные сведения о выравнивании и т. Д. Приведены в разделе 12.6.2 спецификации.
Обратите внимание, чтов вашем примере кода чтение в потоке 2 гарантированно будет атомарным, но оно не гарантированно фактически увидит любые изменения, сделанные потоком 1: без применения барьеров памяти или изменчивости каждый поток может использовать свое собственное представление"поля m_Object
, не видя изменений, внесенных другими потоками.
Так, например, поток 1 может делать (атомарные) записи в собственном представлении m_Object
, но данные толькофактически хранится в регистре или кэше процессора и никогда не помещается в основную память.Точно так же поток 2 также может делать (атомарные) чтения m_Object
, но на самом деле чтение из регистра или кэша ЦП, а не из основной памяти.