Я оцениваю libuv как библиотеку для сервера C/С++, который я пишу. Протокол имеет префикс длины, поэтому, как только я смогу прочитать 32-битное целое число из потока, я смогу определить, какой размер буфера я должен выделить. В документации сказано, что функция uv_read_start может вызываться несколько раз.
UV_EXTERN int uv_read_start(uv_stream_t*, uv_alloc_cb alloc_cb,
uv_read_cb read_cb);
Поскольку я использую протокол с префиксом длины, как только я узнаю правильный размер буфера, я хотел бы выделить его и повторно использовать для последующих чтений, пока не получу все свои байты. Есть ли простой способ сделать это с помощью libuv? Сейчас кажется, что об этом должна позаботиться функция uv_alloc_cb. Могу ли я связать буфер с моим потоковым объектом вместо того, чтобы помещать его на карту или что-то в этом роде?
Поскольку я использую протокол с префиксом длины, я бы вообще не хотел выделять буфер в куче, пока не смогу прочитать первые 4 байта (32 бита). Могу ли я выделить в стеке буфер размером 4 и заставить функцию uv_read_cb фактически выполнять выделение кучи? Вызывается ли функция uv_read_cb синхронно как часть функции uv_read_start? Если это так, то кажется, что я должен иметь возможность выделять в стеке, когда я знаю, что у меня еще нет буфера, прикрепленного к моему потоку.