Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Boost.Flyweight Documentation - Tutorial - Basics

Boost , , Boost.Flyweight Documentation - Tutorial

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

Boost.Flyweight Tutorial: Basics



Contents

Introduction

Предположим, мы пишем огромную многопользовательскую онлайн-игру, которая должна поддерживать в памяти сотни тысяч или миллионы экземпляров следующего класса:

struct user_entry
{
  std::string first_name;
  std::string last_name;
  int         age;
  ...
};

В таких средах ресурсы памяти драгоценны, поэтому мы ищем способы сделать<user_entry>максимально компактным. Как правило, среди пользователей сообщества существует очень высокий уровень повторения имен и фамилий, поэтому очевидная оптимизация заключается в перемещении объектов<user_entry::first_name>и<user_entry::last_name>в общий репозиторий, где дубликаты избегают, и оставлении ссылок на них внутри<user_entry>. Именно это и подстегнуло. Flyweight делает это самым простым способом для программиста:

#include <boost/flyweight.hpp>
struct user_entry
{
  flyweight<std::string> first_name;
  flyweight<std::string> last_name;
  int                    age;
  ...
};

Повышаю. Flyweight автоматически выполняет оптимизацию, только что описанную за кулисами, так что чистый эффект этого изменения заключается в том, что использование памяти программы уменьшается на коэффициент, пропорциональный уровню избыточности среди имен пользователей.

<flyweight<std::string>>ведет себя во многих отношениях как<std::string>; например, следующий код работает без изменений после переопределения<user_entry>:

// flyweight<T> can be constructed in the same way as T objects can,
// even with multiple argument constructors
user_entry::user_entry(const char* f,const char* l,int a,...):
  first_name(f),
  last_name(l),
  age(a),
  ...
{}
// flyweight classes have relational operators replicating the
// semantics of the underyling type
bool same_name(const user_entry& user1,const user_entry& user2)
{
  return user1.first_name==user2.first_name &&
         user1.last_name==user2.last_name;
}
// flyweight<T> provides operator<< and operator>> internally
// forwarding to T::operator<< and T::operator>>
std::ostream& operator<<(std::ostream& os,const user_entry& user)
{
  return os<<user.first_name<<" "<<user.last_name<<" "<<user.age;
}
std::istream& operator>>(std::istream& is,user_entry& user)
{
  return is>>user.first_name>>user.last_name>>user.age;
}

Кроме того,<flyweight<T>>конвертируется в<const T&>, либо неявно, либо через функцию<get>члена:

std::string full_name(const user_entry& user)
{
  std::string full;
  full.reserve(
    user.first_name.get().size()+   // get() returns the underlying
    user.last_name.get().size()+1); // const std::string&
  full+=user.first_name;            // implicit conversion is used here
  full+=" ";
  full+=user.last_name;
  return full;
}

Наиболее важным ограничением, которое следует учитывать при замене класса эквивалентным весом, является тот факт, что весы не являются изменчивыми: поскольку несколько объектов в весе могут иметь одинаковое значение представления, изменение этого значения недопустимо. С другой стороны, объектам с массой тела могут быть присвоены новые значения:

void change_name(
  user_entry& user,
  const std::string& f,const std::string& l)
{
  user.first_name=f;
  user.last_name=l;
}

В общем, интерфейс<flyweight<T>>предназначен для того, чтобы сделать переход от простого<T>как можно более простым. Проверьте ссылкудля получения дополнительной информации об интерфейсе шаблона класса<flyweight>. В разделепримероврассматриваются некоторые общие сценарии использования Boost. Весом.

Serialization

<flyweight<T>>может быть сериализовано с помощьюБиблиотеки усиленной сериализациидо тех пор, пока базовая<T>является сериализуемой. Поддерживаются как обычные, так и XML-архивы. Для того, чтобы увеличить Возможности серийизации с массой полёта должны включать конкретный заголовок<"boost/flyweight/serialize.hpp">.

#include <boost/flyweight/serialize.hpp>
template<class Archive>
void serialize(Archive& ar,user_entry& user,const unsigned int)
{
  ar&user.first_name;
  ar&user.last_name;
  ar&user.age;
  ...
}

То же самое, что и Boost. Flyweight уменьшает потребление памяти из-за внутреннего обмена дублирующими значениями, сериализация<flyweight>s также может привести к уменьшению архивных файлов, поскольку общее значение сохраняется только один раз, а связанные с ним<flyweight>s сохраняются в качестве ссылок на него. Эта политика соблюдается, даже если<flyweight>основной тип не отслеживаетсяBoost.Serialization.

См.пример 6в разделе примеров для иллюстрации использования Boost. Возможности серийного производства.

Flyweight requirements

Чтобы<flyweight<T>>был мгновенным,<T>должен быть<Assignable>,<Equality Comparable>и должен взаимодействовать сBoost.Hash. Первое требование, вероятно, выполняется без каких-либо дополнительных усилий со стороны пользователя, не так как два других, за исключением наиболее распространенных основных типов C++ и стандартной библиотеки. Равенство и хеширование<T>используются внутри<flyweight<T>>внутренней фабрики для поддержания общего хранилища уникальных<T>значений, упоминаемых объектами с массой тела. Проконсультируйтесь с Boost. Хеш-документацияраздело расширении этой библиотеки для пользовательских типов данных.

Как мы видели, требования к равенству и хешированию<T>налагаются конкретным типомфабрики по производству легкого веса, используемой внутри<flyweight<T>>. Позже мы увидим, как пользователь может настроить эту фабрику, чтобы использовать равенство и хеш-предикаты, отличные от по умолчанию, или даже переключиться на совершенно другой тип фабрики, который может налагать другие требования на<T>, как описано в разделенастройки Boost.Flyweight.




Пересмотрено 1 сентября 2014 года

© Copyright 2006-2014 Joaquín M López Muñoz. Распространяется под лицензией Boost Software License, версия 1.0. (См. сопроводительный файлLICENSE_1_0.txtили копию в) http://www.boost.org/LICENSE_1_0.txt

Статья Boost.Flyweight Documentation - Tutorial - Basics раздела Boost.Flyweight Documentation - Tutorial может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Boost.Flyweight Documentation - Tutorial ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-07-05 05:17:07/0.0047318935394287/0