так что в C ++ это очень просто. вы хотите, чтобы какой-либо класс / структура был размещен в куче, используйте 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 секунды! это в пять раз медленнее