| <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0.1 Transitional//EN"> |
| |
| <html> |
| <head> |
| <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> |
| <title>Boost.Flyweight Documentation - Tutorial</title> |
| <link rel="stylesheet" href="../style.css" type="text/css"> |
| <link rel="start" href="../index.html"> |
| <link rel="prev" href="../index.html"> |
| <link rel="up" href="../index.html"> |
| <link rel="next" href="basics.html"> |
| </head> |
| |
| <body> |
| <h1><img src="../../../../boost.png" alt="Boost logo" align= |
| "middle" width="277" height="86">Boost.Flyweight Tutorial</h1> |
| |
| <div class="prev_link"><a href="../index.html"><img src="../prev.gif" alt="index" border="0"><br> |
| Index |
| </a></div> |
| <div class="up_link"><a href="../index.html"><img src="../up.gif" alt="index" border="0"><br> |
| Index |
| </a></div> |
| <div class="next_link"><a href="basics.html"><img src="../next.gif" alt="basics" border="0"><br> |
| Basics |
| </a></div><br clear="all" style="clear: all;"> |
| |
| <hr> |
| |
| <h2>Contents</h2> |
| |
| <ul> |
| <li><a href="#rationale">Rationale</a></li> |
| <li><a href="#namespace">Namespace</a></li> |
| <li><a href="#guide">Guide to the reader</a></li> |
| <li><a href="basics.html">Basics</a></li> |
| <li><a href="key_value.html">Key-value flyweights</a></li> |
| <li><a href="configuration.html">Configuring Boost.Flyweight</a></li> |
| <li><a href="extension.html">Extending Boost.Flyweight</a></li> |
| <li><a href="technical.html">Technical issues</a></li> |
| <li><a href="lambda_expressions.html">Annex: MPL Lambda expressions</a></li> |
| </ul> |
| |
| <h2><a name="rationale">Rationale</a></h2> |
| |
| <span style="float:left;margin-right:20px;margin-bottom:20px"> |
| <p align="center"> |
| <img src="flyweight_rep.png" |
| alt="representation of a flyweight scenario" |
| width="424" height="320"><br> |
| <b>Fig. 1: Representation of a flyweight scenario.</b> |
| </p> |
| </span> |
| |
| <p> |
| Consider an application that has to manage large quantities of objects of |
| moderate size, potentially requiring more memory than reasonably available. |
| When these objects are <i>immutable</i>, i.e. they do not modify its internal |
| state except maybe for reattaching to a new set of state data, and some |
| additional conditions are met, a very convenient optimization technique known |
| as the <i>flyweight pattern</i> can be introduced. |
| </p> |
| |
| <p> |
| Let us say there are <i>N</i> different objects living at a given time |
| inside the application, globally taking <i>M</i> different values. If <i>N</i> |
| is much greater than <i>M</i>, that is, there are many equivalent objects, |
| we can eliminate the implicit redundancy by replacing the original objects with |
| handle classes which refer to a common repository of shared value objects, |
| as depicted in the figure. The handle objects or flyweights, which act as |
| proxies for the actual values, typically occupy the size of a mere pointer. |
| The larger the value classes, and the greater the <i>N</i>/<i>M</i> ratio, |
| the more significant the memory savings achieved by this tecnhique. The |
| classical example of application of the flyweight idiom is that of a word |
| processor: each letter in the document carries a large wealth of |
| information, such as its Unicode identifier, font, size, typesetting effects, |
| etc., but given that the degree of letter repetition in a document is extremely |
| high, implementing those letters as flyweight classes allows us to easily |
| handle documents ranging in the hundreds of thousands of characters. |
| </p> |
| |
| <p> |
| Most presentations of the design pattern found in the literature do make a |
| distinction between the flyweight <i>intrinsic information</i> (the constant |
| data factored out into the repository) and <i>extrinsic</i>, mutable |
| information, which is stored along with the flyweight objects or passed |
| externally. This separation analysis can have some merit from the point of |
| view of application design, but when it comes to implementation extrinsic |
| information has no impact on the overall flyweight scheme. So, |
| Boost.Flyweight assumes that the type onto which the library operates |
| entirely consists of intrinsic information: this allows for a particularly |
| appealing realization of the idiom in C++ in which |
| <code>flyweight<T></code> is an opaque type convertible to |
| <code>const T&</code>. |
| </p> |
| |
| <p> |
| The central repository of shared value objects is known as the <i>flyweight |
| factory</i>. This component is able to locate and return a reference to an |
| object with a given value, or insert the value if no copy was previously |
| stored. Boost.Flyweight controls the interaction of flyweights with |
| their factory transparently to the programmer, so that a casual user of the |
| library need not even be concerned about the presence of such factory. |
| Boost.Flyweight uses by default a factory based on a hashed container which |
| is expected to be suitable for most situations. When this is not the case, it |
| is possible to customize the factory or even replace it with another one of |
| a different type, either provided by Boost.Flyweight or defined by the user. |
| Other aspects of the implementation are also customizable and extendable. |
| </p> |
| |
| <h2 clear="all" style="clear: all;"> |
| <a name="namespace">Namespace</a> |
| </h2> |
| |
| <p> |
| All the public types of Boost.Flyweight reside in namespace <code>::boost::flyweights</code>. |
| Additionaly, the main class template <code>flyweight</code> is lifted to namespace |
| <code>::boost</code> by means of a <code>using</code> declaration. For brevity of |
| exposition, the fragments of code in the documentation are written as if the following |
| directives were in effect: |
| </p> |
| |
| <blockquote><pre> |
| <span class=keyword>using</span> <span class=keyword>namespace</span> <span class=special>::</span><span class=identifier>boost</span><span class=special>;</span> |
| <span class=keyword>using</span> <span class=keyword>namespace</span> <span class=special>::</span><span class=identifier>boost</span><span class=special>::</span><span class=identifier>flyweights</span><span class=special>;</span> |
| </pre></blockquote> |
| |
| <h2><a name="guide">Guide to the reader</a></h2> |
| |
| <p> |
| Although Boost.Flyweight features an extensive customization |
| framework controlling many internal implementation aspects, the library is designed |
| in such a way that most users need not be concerned about or |
| even aware of the underlying complexity. Learning to use Boost.Flyweight |
| as an off-the-shelf component can be acomplished merely by reading |
| the <a href="basics.html">basics</a> section and skimming through the |
| part on <a href="key_value.html">key-value flyweights</a>, the section on flyweight type |
| <a href="configuration.html#tagging">tagging</a> and the discussion of some |
| <a href="technical.html">technical issues</a>. The |
| <a href="configuration.html">configuration</a> section teaches how to fine tune the |
| different internal components of the library. Only very advanced usage |
| scenarios will require implementing user-provided pluggable components: |
| this is covered on the <a href="extension.html">extension</a> section. |
| </p> |
| |
| <hr> |
| |
| <div class="prev_link"><a href="../index.html"><img src="../prev.gif" alt="index" border="0"><br> |
| Index |
| </a></div> |
| <div class="up_link"><a href="../index.html"><img src="../up.gif" alt="index" border="0"><br> |
| Index |
| </a></div> |
| <div class="next_link"><a href="basics.html"><img src="../next.gif" alt="basics" border="0"><br> |
| Basics |
| </a></div><br clear="all" style="clear: all;"> |
| |
| <br> |
| |
| <p>Revised August 13th 2008</p> |
| |
| <p>© Copyright 2006-2008 Joaquín M López Muñoz. |
| Distributed under the Boost Software |
| License, Version 1.0. (See accompanying file <a href="../../../../LICENSE_1_0.txt"> |
| LICENSE_1_0.txt</a> or copy at <a href="http://www.boost.org/LICENSE_1_0.txt"> |
| http://www.boost.org/LICENSE_1_0.txt</a>) |
| </p> |
| |
| </body> |
| </html> |