У меня есть этот пример кода:
Код: Выделить всё
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) 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
Код: Выделить всё
L0000: lea ecx, [esp+4]
L0004: call 0x376f0018
L0009: inc eax
L000a: ret 0x18
Вы можете видеть код здесь DEMO
Интересно, что если я удалю in для функции, передающей Foo1, вы получите меньше инструкций при передаче Foo2 с помощью in:
Код: Выделить всё
[MethodImpl(MethodImplOptions.NoInlining)]
public static int M2(Foo1 f) =>f.i1 + 1; //`in` removed
Код: Выделить всё
L0000: call 0x38740018
L0005: inc eax
L0006: ret
Подробнее здесь: https://stackoverflow.com/questions/792 ... the-struct
Мобильная версия