так что в с ++ это очень просто. Вы хотите, чтобы любой класс / структура был размещен в куче, используйте new. если вы хотите использовать его в стеке, не используйте new.
в C # мы всегда используем ключевое слово new, и в зависимости от того, является ли это структура или класс, он размещается либо в стеке, либо в куче (структуры идут в стек, классы в кучу) - и в некоторых приложениях может быть ОГРОМНАЯ разница в производительности при изменении дизайна, так что только те объекты попадают в кучу, которая действительно там находится.
Что мне интересно, так это - есть ли прямой способ контролировать, где объект размещается независимо от того, объявлен ли он как структура или класс? я знаю, что типы значений (структуры) могут быть упакованы, чтобы попасть в кучу (но упаковка / распаковка происходит за счет производительности). Есть ли способ размещения классов в стеке?
Кроме того, есть ли механизм для выделения необработанной памяти и использования чего-то вроде размещения новых в C ++? Я знаю, что это противоречит идее управления, но это может иметь большое значение для производительности, если вы можете использовать свое собственное управление памятью.
Мне нравится C # за его удобство, за сборщик мусора и другие вещи - но иногда, работая над узким местом приложения, желательно иметь больший контроль над тем, что происходит на самом деле.
Любые советы / подсказки приветствуются:)
редактировать: пример производительности:
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 изменяется со структуры на класс, выполнение занимает 8,9 секунды! это в пять раз медленнее