Что такое "зона" MsgPack
Я видел ссылки на "зону" в заголовки MsgPack c, но не может найти документации о том, что это такое или для чего это. Что это? Кроме того, где документация по функциям для API C?
2 ответов
msgpack_zone
- внутренняя структура, используемая для управления памятью и жизненного цикла во время распаковки. Я бы сказал, что вам никогда не придется взаимодействовать с ним, если вы используете стандартный интерфейс высокого уровня для распаковка или альтернативный вариант потокового версия.
насколько мне известно, нет подробной документации: вместо этого вы должны обратиться к набору тестов, который предоставляет удобные образцы кода для достижения общих задач, например, см. pack_unpack_c.cc
и streaming_c.cc
.
из того, что я мог бы собрать, это тип только для перемещения, который хранит фактические данные msgpack::object
. Это очень хорошо может быть детализацией реализации, но на самом деле иногда она просачивается в код пользователей. Например, в любое время, когда вы хотите захватить msgpack::object
в лямбде вы должны захватить msgpack::zone
а также объект. Иногда вы не можете использовать Move capture (например, обработчики asio в некоторых случаях будут принимать только копируемые обработчики, или ваш компилятор не поддерживает эту функцию). Чтобы обойти это, вы можете:
msgpack::unpacked r;
while (pac_.next(&r)) {
auto msg = result.get();
io_->post([this, msg, z = std::shared_ptr<msgpack::zone>(r.zone().release())]() {
// msg is valid here
}));
}