Можно ли использовать alloca для сопрограмм C++?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Можно ли использовать alloca для сопрограмм C++?

Сообщение Anonymous »

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

Подробнее здесь: https://stackoverflow.com/questions/793 ... coroutines
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»