Смехотворец
Зарегистрирован: 28 March 2005
Сообщения: 1166
Примеры кода: 1
|
RE[4]: Влияет ли использование ключевого слова readonly на генерируемый код? |
09 June 2006 10:40 |
|
|
|
|
Блин, Бог Неба это одно, а дирижабль совсем другое.
У объектов есть поля и свойства, к языку это никакого отношения не имееет, а переменные объявляются внутри методов (накрайняк, иногда говорят, что поле - это переменная объекта, но крайне редко, если будешь спорить, приведу ссылки на MSDN, не поленюсь!). readonly в .NET относится именно к полям, про свойства правильнее говорить что они имеют или не имеют get/set accessor-ов (не знаю как по русски, нет устоявшейся терминологии), ибо установка свойства, это нечто большее, чем присвоение значения полю. А вопрос заключался именно во влиянии readonly на генерацию кода. Например имеем код (переменные суть поля объекта):
b = a + b;
c = a + c;
в общем случае компилится примерно так:
mov edx, [eax + смещение a]
mov ecx, [eax + смещение b]
add edx, ecx
mov [eax + смещение b], edx
mov edx, [eax + смещение a]
mov ecx, [eax + смещение c]
add edx, ecx
mov [eax + смещение c], edx
а если исзвестно, что a не меняется с момента создания, можно смело делать так
mov edx, [eax + смещение a]
mov ecx, [eax + смещение b]
add ecx, edx
mov [eax + смещение b], ecx
mov ecx, [eax + смещение c]
add ecx, edx
mov [eax + смещение c], ecx
т.е. один раз загрузить а в регистр (или локальную переменную, если делать эту оптимизацию на уровне MSIL) и пользовать ее на всей области действия метода. Теперь внимание, вопрос знатокам:
Атрибут поля InitOnly влият на оптимизацию MSIL-а/ассемблера, или выполняет чисто косметическую функцию, запрещая компилятору компилировать программы, которые пытаются присвоить что-нибудь readonly полям?
Программирую за еду.
|
|