C++ по умолчанию использует глобальное размещение new для размещения сопрограмм. Но это потенциально снижает производительность по сравнению с Rust, который может распределять их по стеку. Это разочаровывает, потому что для большинства случаев использования сопрограмм это было бы нормально - часто вы co_await сопрограмму прямо при ее создании или co_await ее объединение/комбинатор и несколько других сразу. Вы можете переопределить оператор new и оператор delete для типа обещания и создать собственный распределитель, который выполняет строгое распределение FIFO по некоторой заранее выделенной области кучи, но в целом все равно лучше повторно использовать уже существующий, уже горячий в стеке кэша.
AFAICT невозможно использовать alloca для этого на лету - любой вызов его в операторе new будет освобождается, когда функция оператора возвращается. Вы можете заранее выделить большой кусок пространства с помощью alloca в какой-нибудь функции верхнего уровня, а затем определить оператор new для типа обещания, который будет выделяться из этого региона, но это фактически то же самое, что иметь отдельную кучу выделенная область с точки зрения горячего кэша (все ваши сопрограммы используют отдельную специальную, иначе холодную область, вместо того, чтобы смешиваться с вашими обычными вызовами, используя реальную вершину стека).
Есть ли там любой способ сделать alloca работает?
Здесь есть связанный с этим вопрос о том, можете ли вы вызвать alloca внутри сопрограммы, но я спрашиваю о используя его для поддержки выделения самой сопрограммы (что обязательно происходит вне ее) перед ее запуском.
Подробнее здесь: https://stackoverflow.com/questions/793 ... coroutines
Можно ли использовать alloca для сопрограмм C++? ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение