![[Pasted image 20240205142253.png]]
Более конкретное название участка, где происходит аллокация:
HashSet'1.System.Collections.Generic.IEnumerable\<T\>.GetEnumerator()
Участок кода, который вызывает аллокацию памяти в куче:
```csharp
hashSet.UnionWith(baseComponents);
```
Решением стало, просто заменить на `foreach`
```csharp
foreach (var baseComp in baseComponents)
{
hashSet.Add(baseComp;
}
```
### Почему использование UnionWith вызывает аллокацию?
Я так и не смог выяснить за короткое время
Ответ ChatGPT на этот счет:
**Почему аллокация памяти пропала?** При использовании цикла `foreach` и метода `Add`, вы, вероятно, избегаете накладных расходов, связанных с внутренней логикой метода `UnionWith`, которая может включать дополнительные проверки, промежуточные структуры для обработки элементов и потенциальное увеличение размера `HashSet`. В вашем случае, если размер `HashSet` был изначально достаточным или добавляемые элементы не требовали значительного увеличения размера внутреннего хранилища, то дополнительные аллокации в куче и не произошли бы.
Это пример того, как более низкоуровневое управление операциями с коллекциями может привести к оптимизации по памяти, особенно в сценариях, где производительность и эффективность использования ресурсов критичны, как в вашем случае с разработкой игры.