Сборка для передачи структур различается в зависимости от размера структуры.C#

Место общения программистов C#
Ответить
Anonymous
 Сборка для передачи структур различается в зависимости от размера структуры.

Сообщение Anonymous »

Я изучал защитное копирование структур и пытаюсь понять, почему инструкции изменяются при передаче структур разного размера в функцию с ключевым словом in.
У меня есть этот пример кода:

Код: Выделить всё

public readonly struct Foo1
{
public readonly int i1;
}
public readonly struct Foo2
{
public readonly int i1,i2,i3,i4,i5,i6;

}
public class C {
public static int M(Foo1 foo) {
var a = M2(foo);
return a + 1;
}

[MethodImpl(MethodImplOptions.NoInlining)]
public static int M2(in Foo1 f) =>f.i1 + 1;
[MethodImpl(MethodImplOptions.NoInlining)]
public static int M2(in Foo2 f) =>f.i1 + 1;
}
Если я изменю M(Foo1 foo) на M(Foo2 foo), я получу разные инструкции, хотя единственная разница - это размер структуры:
Если я изменю M(Foo1 foo) на M(Foo2 foo), я получу разные инструкции, хотя единственная разница - это размер структуры:
Если я изменю M(Foo1 foo) на M(Foo2 foo), я получу разные инструкции, хотя единственная разница - это размер структуры:
Если я изменю M(Foo1 foo) на M(Foo2 foo), я получу разные инструкции, хотя единственная разница - это размер структуры:
Если я изменю M(Foo1 foo) на M(Foo2 foo) p>
C.M(Foo1) :: маленькая структура

Код: Выделить всё

L0000: push eax
L0001: mov [esp], ecx
L0004: lea ecx, [esp]
L0007: call 0x376b0018
L000c: inc eax
L000d: pop ecx
L000e: ret
C.M(Foo2) :: большая структура

Код: Выделить всё

L0000: lea ecx, [esp+4]
L0004: call 0x376f0018
L0009: inc eax
L000a: ret 0x18
Передается ли здесь Foo1 по значению, что приводит к созданию защитной копии?
Вы можете видеть код здесь DEMO
Интересно, что если я удалю in для функции, передающей Foo1, вы получите меньше инструкций при передаче Foo2 с помощью in:

Код: Выделить всё

[MethodImpl(MethodImplOptions.NoInlining)]
public static int M2(Foo1 f) =>f.i1 + 1; //`in` removed
C.M(Foo1) :: в удален

Код: Выделить всё

L0000: call 0x38740018
L0005: inc eax
L0006: ret
Я изо всех сил пытаюсь понять, почему существуют различия при передаче с ключевым словом in. Разве это не должна быть ссылка на структуру в обоих случаях, а не передача по значению, тогда почему размер структур меняет инструкции?

Подробнее здесь: https://stackoverflow.com/questions/792 ... the-struct
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»