Хочется странного программировать на C# как на C, т.е. распределить кусок памяти, припинить его и насоздавать там внутри структур независимо от сборщика мусора.
"The fixed keyword must be in an method labelled unsafe, which in turn requires the /unsafe compiler flag."
"GCHandle.Alloc(…) discreetly circumvents this safeguard, thereby raising fewer eyebrows in a code review."
GCHandle gCBuffer = GCHandle.Alloc(Buffer, GCHandleType.Pinned);
"It does require full trust, though, which is equivalent to unsafe code."
Зачем (может быть) нужно создавать структуры в буфере?
1) чтобы иметь возможность освободить все объекты разом, освободив всю область, без всяких там сборок мусора
2) чтобы весь этот буфер зашарить с другим процессом через memory mapping
Во втором случае структуры могут быть сложными и reference counting или какое другое ручное управление может пригодится.
Здравствуйте, Эйнсток Файр, Вы писали:
ЭФ>Хочется странного программировать на C# как на C, т.е. распределить кусок памяти, припинить его и насоздавать там внутри структур независимо от сборщика мусора.
ЭФ>"The fixed keyword must be in an method labelled unsafe, which in turn requires the /unsafe compiler flag." ЭФ>"GCHandle.Alloc(…) discreetly circumvents this safeguard, thereby raising fewer eyebrows in a code review."
ЭФ>GCHandle gCBuffer = GCHandle.Alloc(Buffer, GCHandleType.Pinned); ЭФ>"It does require full trust, though, which is equivalent to unsafe code."
ЭФ>Зачем (может быть) нужно создавать структуры в буфере? ЭФ>1) чтобы иметь возможность освободить все объекты разом, освободив всю область, без всяких там сборок мусора
в .NET скорость сборки мусора не зависит от кол-ва умерших объектов. Только от кол-ва живых. Так что тут тебе ничего ненужно делать.
ЭФ>2) чтобы весь этот буфер зашарить с другим процессом через memory mapping
ЭФ>Во втором случае структуры могут быть сложными и reference counting или какое другое ручное управление может пригодится.
ref counting чего, отдельной структуры? как это сочитается с желанием освобождать все структуры разом? Или это не связанные задачи?
J>в .NET скорость сборки мусора не зависит от кол-ва умерших объектов. Только от кол-ва живых. Так что тут тебе ничего ненужно делать.
Если у меня живых много, я могу повысить отзывчивость конкретного UI-процесса, уменьшив количество живых объектов,
путём выведения части этих объектов из-под контроля GC.
ЭФ>>2) чтобы весь этот буфер зашарить с другим процессом через memory mapping ЭФ>>Во втором случае структуры могут быть сложными и reference counting или какое другое ручное управление может пригодится. J> ref counting чего, отдельной структуры?
да, отдельной структуры J> как это сочитается с желанием освобождать все структуры разом? Или это не связанные задачи?
это несвязанные сценарии
Здравствуйте, Эйнсток Файр, Вы писали:
ЭФ>Хочется странного программировать на C# как на C, т.е. распределить кусок памяти, припинить его и насоздавать там внутри структур независимо от сборщика мусора.
Просто напишите критичный кусок на C и используйте из C#.
ЭФ>> Хочется странного программировать на C# как на C, т.е. распределить кусок памяти, припинить его и насоздавать там внутри структур независимо от сборщика мусора. V> Просто напишите критичный кусок на C и используйте из C#.
В целевой операционной системе нет C-тулчейна. Просто нет.
Здравствуйте, Эйнсток Файр, Вы писали:
ЭФ>>> Хочется странного программировать на C# как на C, т.е. распределить кусок памяти, припинить его и насоздавать там внутри структур независимо от сборщика мусора. V>> Просто напишите критичный кусок на C и используйте из C#.
ЭФ>В целевой операционной системе нет C-тулчейна. Просто нет.
Прикольно. .NET есть, а Сишечки нет?? А что это за OS?
Здравствуйте, Эйнсток Файр, Вы писали:
ЭФ>Во втором случае структуры могут быть сложными и reference counting или какое другое ручное управление может пригодиться. ЭФ>Чего я не понимаю, или не знаю?
Я не очень понимаю, зачем нужен reference counting, если речь про структуры, на которые сборщику мусора плевать (если внутри них нет ссылочных полей).
Можно создать в управляемой куче массив байт нужной длины, закрепить его в памяти через GCHandle.Alloc и читать/писать в него разные структуры через указатели. Можно для тех же целей выделить буфер в неуправляемой куче и делать то же самое в нём:
Здравствуйте, Эйнсток Файр, Вы писали:
ЭФ>>> Хочется странного программировать на C# как на C, т.е. распределить кусок памяти, припинить его и насоздавать там внутри структур независимо от сборщика мусора. V>> Просто напишите критичный кусок на C и используйте из C#.
ЭФ>В целевой операционной системе нет C-тулчейна. Просто нет.
То есть дотнет рантайм с ансейф есть, а сишного компилятора нет?
Ух ты, а что это за целевая система такая?
Здравствуйте, Jack128, Вы писали:
ЭФ>>1) чтобы иметь возможность освободить все объекты разом, освободив всю область, без всяких там сборок мусора J>в .NET скорость сборки мусора не зависит от кол-ва умерших объектов. Только от кол-ва живых. Так что тут тебе ничего ненужно делать.
Косвенно, наверное, может увеличить суммарные затраты на GC?
Чем больше короткоживущих объектов создается, тем быстрее память будет заканчиваться, тем чаще GC будет запускаться?