поэтому в С++ это очень просто. вы хотите, чтобы какой-либо класс/структура был выделен в куче, используйте новый. если вы хотите его в стеке, не используйте новый.
в С# мы всегда используем новое ключевое слово и в зависимости от того, была ли она структурой или классом, выделенным либо в стеке, либо в куче (структуры переходят в стек, классы в кучу), а в некоторых приложениях может быть ОГРОМНОЙ разницей в производительности при изменении дизайна, так что только те объекты попадают в кучу, которая действительно принадлежит там.
Что мне интересно - есть ли прямой способ контролировать, где объект выделяется независимо от того, объявлен он как struct или class? Я знаю, что типы значений (структуры) могут быть помещены в кучу, чтобы перейти в кучу (но бокс/распаковка происходит за счет производительности). есть ли способ выделить классы в стеке?
Кроме того, есть ли какой-либо механизм выделения необработанной памяти и использовать что-то вроде размещения new в С++? Я знаю, что это ломается с идеей управления - но это может привести к большой разнице в производительности, если вы можете использовать свое собственное управление памятью.
Мне нравится С# для удобства, для сборщика мусора и других вещей - но иногда, работая над узким местом приложения, очень желательно иметь больший контроль над тем, что на самом деле происходит.
Любые советы/подсказки приветствуются:)
edit: пример производительности:
struct Foo1
{
public int i;
public float f;
public double d;
}
struct Foo2
{
public Foo1[] bar;
public void Init(){
bar = new Foo1[100];
for (int i = 0; i < 100; i++)
bar[i] = new Foo1();
}
}
class Program
{
static void Main(string[] args)
{
DateTime time = DateTime.Now;
Foo2[] arr = new Foo2[1000000];
for (int i = 0; i < 1000000; i++)
{
arr[i] = new Foo2();
arr[i].Init();
}
Console.WriteLine((DateTime.Now - time).TotalMilliseconds);
}
}
Это займет 1,8 секунды на моей машине для выполнения (обратите внимание, что на самом деле происходит только распределение - без передачи параметров)
если Foo1 изменен с struct на класс, выполнение занимает 8,9 секунды! что в пять раз медленнее