tag:linuxfr.org,2005:/tags/new/publicLinuxFr.org : les contenus étiquetés avec « new »2013-04-20T15:38:46+02:00/favicon.pngtag:linuxfr.org,2005:Post/325432013-04-20T12:14:01+02:002013-04-20T12:21:09+02:00operator new + boost::fast_pool_allocator<p>Bonjour,</p>
<p>Dans le cadre d'un de mes projets qui alloue/désalloue beaucoup d'objets de tailles diverses mais relativement petits (< 100o par objets), j'observe une consommation mémoire très supérieur à ce que ça devrait être.<br />
Comme je soupçonne que la mémoire ressemble à du gruyère (plus il y a de gruyère, plus il y a de trous et plus il y a de trous, moins il y a de gruyère), j'ai voulu tester le pool allocator de boost en surchargeant l'operator new.</p>
<p>Mais avec le cas simplifié ci-dessous, alors que le programme devrait prendre 256Mo de mémoire + éventuellement un peu d'overhead, il en consomme 2x plus soit 512Mo.<br />
Ce facteur de 2x ne change pas selon la taille de l'objet, ni selon le nombre d'allocations.</p>
<pre>
<code class="c++"><span class="cp">#include <boost/pool/pool_alloc.hpp></span>
<span class="cp">#include <cstdio></span>
<span class="k">class</span> <span class="nc">Foo</span>
<span class="p">{</span>
<span class="k">private</span><span class="o">:</span>
<span class="k">static</span> <span class="n">boost</span><span class="o">::</span><span class="n">fast_pool_allocator</span><span class="o"><</span><span class="n">Foo</span><span class="o">></span> <span class="n">pool</span><span class="p">;</span>
<span class="kt">char</span> <span class="n">data</span><span class="p">[</span><span class="mi">256</span><span class="p">];</span>
<span class="k">public</span><span class="o">:</span>
<span class="k">static</span> <span class="kt">void</span> <span class="o">*</span> <span class="k">operator</span> <span class="k">new</span><span class="p">(</span><span class="n">size_t</span> <span class="n">size</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">pool</span><span class="p">.</span><span class="n">allocate</span><span class="p">();}</span>
<span class="k">static</span> <span class="kt">void</span> <span class="k">operator</span> <span class="k">delete</span><span class="p">(</span><span class="kt">void</span> <span class="o">*</span> <span class="n">ptr</span><span class="p">)</span> <span class="p">{</span> <span class="n">pool</span><span class="p">.</span><span class="n">deallocate</span><span class="p">(</span><span class="k">reinterpret_cast</span><span class="o"><</span><span class="n">Foo</span><span class="o">*></span><span class="p">(</span><span class="n">ptr</span><span class="p">));</span> <span class="p">}</span>
<span class="p">};</span>
<span class="cp">#define NB_ALLOC 1024*1024</span>
<span class="kt">int</span> <span class="n">main</span><span class="p">()</span>
<span class="p">{</span>
<span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o"><</span> <span class="n">NB_ALLOC</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="p">{</span>
<span class="k">new</span> <span class="n">Foo</span><span class="p">();</span>
<span class="p">}</span>
<span class="n">getchar</span><span class="p">();</span>
<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code>
</pre>
<p>Est-ce que je m'y prend mal ?<br />
Est-ce normal ?</p>
<p>si c'est normal avec cet allocateur, en connaissez vous d'autres que je pourrais tester qui permettent de palier à mon problème ?</p>
<p>Merci d'avance</p>
<p>errno</p><div><a href="https://linuxfr.org/forums/programmation-c/posts/operator-new-boost-fast_pool_allocator.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/98071/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/forums/programmation-c/posts/operator-new-boost-fast_pool_allocator#comments">ouvrir dans le navigateur</a>
</p>
errnohttps://linuxfr.org/nodes/98071/comments.atom