У меня есть вопрос о переупорядочивании юридических инструкций в C#/.NET.
Начнем с этого примера. У нас есть этот метод, определенный в каком-то классе, где _a, _b и _c — поля.
int _a;
int _b;
int _c;
void Foo()
{
_a = 1; // Write 1
_b = 1; // Write 2
_c = 1; // Write 3
}
И наша среда вызова будет выглядеть примерно так.
//memory operations
ClassInstance.Foo();
//memory operations
Мне интересно, какие допустимые переупорядочивания инструкций возможны, когда этот вызов метода становится встроенным по сравнению с вызовом функции. В частности, мне интересно, допустимо ли и когда переупорядочивать операции с памятью в Foo(), с операциями с памятью вне его (из нашего предыдущего примера, //операций с памятью).
Кроме того, вызов функции (не встроенный) в некотором смысле «создает барьеры памяти». Например, операции с памятью, которые происходят до или после вызова функции, не могут быть переупорядочены с операциями с памятью внутри вызова функции.
Если да, будет ли он по-прежнему иметь это поведение «барьера памяти», когда он будет встроен компилятором?