Что такое "зона" 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            
             }));
}