Entry tags:
48 байт на одну сопрограмму
Судя по комментам к предыдущему посту, существует устойчивое подозрение, что сопрограммы имеют стек, и вообще кушают ресурсы. Хорошо, давайте померяем, это нетрудно. Создадим миллион сопрограмм и глянем расход памяти. Вот такой тестик.
Результат:co_void_t print(int n)
{
for (;;) {
std::cout << n << std::endl;
co_await co_await_t{};
}
}
int main(int argc, char **argv)
{
std::coroutine_handle<> continuation[1000000];
std::cout << "Using " << mallinfo().uordblks << " bytes after start.\n";
for (int i = 0; i < 1000000; i++)
continuation[i] = print(i);
std::cout << "Using " << mallinfo().uordblks << " bytes after coroutine allocation.\n";
for (int i = 0; i < 1000000; i++)
continuation[i].resume();
std::cout << "Using " << mallinfo().uordblks << " bytes after coroutine run.\n";
for (int i = 0; i < 1000000; i++)
continuation[i].destroy();
std::cout << "Using " << mallinfo().uordblks << " bytes after coroutine destroyed.\n";
return 0;
}
Делим разницу на количество сопрограмм: (48077488 - 77488) / 1000000 = 48 байтов на одну сопрограмму. Вполне недорогое удовольствие получается. Конечно, никакого собственного стека у сопрограмм не имеется, просто негде.Using 77488 bytes after start.
Using 48077488 bytes after coroutine allocation.
0
...
999999
Using 48077488 bytes after coroutine run.
Using 77824 bytes after coroutine destroyed.
no subject
no subject
no subject
Всё равно нет никакой цепи continuations. Стандартная цепочка вложенных вызовов на обычном стеке.