Почему нет выделения дополнительной памятиC#

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

Сообщение Anonymous »

Когда я проводил следующий тест производительности, данные теста показали, что дополнительного выделения памяти не было. Однако разве преобразование структуры в интерфейс не предполагает упаковку?
[MemoryDiagnoser]
public class Test
{
[Benchmark]
public Color Test123()
{
Color color = new Color();
IFormattable formattable = color;
return (Color)formattable;
}

[Benchmark]
public int Test234()
{
int number = 114514;
IConvertible convertible = number;
return (int)convertible;
}
}

[StructLayout(LayoutKind.Sequential)]
public struct Color : IFormattable
{
public double R { get; set; }
public double G { get; set; }
public double B { get; set; }
public double A { get; set; }

public static Color GetRandomColor()
{
Random rand = new Random();
double r = rand.Next(0, 256) * rand.NextDouble();
double g = rand.Next(0, 256) * rand.NextDouble();
double b = rand.Next(0, 256) * rand.NextDouble();
double a = rand.Next(0, 256) * rand.NextDouble();

return new Color(r, g, b, a);
}

public string ToString(string? format, IFormatProvider? formatProvider)
{
return $"{R} {G} {B} {A}";
}

public Color(double r, double g, double b, double a)
{
R = r;
G = g;
B = b;
A = a;
}
public static bool operator ==(Color left, Color right)
{
return left.R == right.R && left.G == right.G && left.B == right.B && left.A == right.A;
}

public static bool operator !=(Color left, Color right)
{
return !(left == right);
}
}

.NET 8
result
Структура Color состоит всего из четырех двойных членов: RGBA.< /p>
"Я попробовал открыть Rider для анализа IL-кода и обнаружил, что там действительно есть инструкции по упаковке и распаковке. Хотелось бы понять, почему нет дополнительного выделения памяти."
.method public hidebysig static valuetype Program.Color
Test123() cil managed
{
.maxstack 1
.locals init (
[0] valuetype Program.Color color,
[1] class [System.Runtime]System.IFormattable formattable,
[2] valuetype Program.Color V_2
)

// [28 9 - 28 10]
IL_0000: nop

// [29 13 - 29 39]
IL_0001: ldloca.s color
IL_0003: initobj Program.Color

// [30 13 - 30 46]
IL_0009: ldloc.0 // color
IL_000a: box Program.Color
IL_000f: stloc.1 // formattable

// [31 13 - 31 39]
IL_0010: ldloc.1 // formattable
IL_0011: unbox.any Program.Color
IL_0016: stloc.2 // V_2
IL_0017: br.s IL_0019

// [32 9 - 32 10]
IL_0019: ldloc.2 // V_2
IL_001a: ret

} // end of method Program::Test123


Подробнее здесь: https://stackoverflow.com/questions/790 ... allocation
Ответить

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

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

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

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

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