AC_MSG_CHECKING([for std::allocator base class])
GLIBCXX_ENABLE(libstdcxx-allocator,auto,[[[=KIND]]],
[use KIND for target std::allocator base],
- [permit new|malloc|mt|bitmap|pool|yes|no|auto])
+ [permit new|malloc|yes|no|auto])
# If they didn't use this option switch, or if they specified --enable
# with no specific model, we'll have to look for one. If they
# Set configure bits for specified locale package
case ${enable_libstdcxx_allocator_flag} in
- bitmap)
- ALLOCATOR_H=config/allocator/bitmap_allocator_base.h
- ALLOCATOR_NAME=__gnu_cxx::bitmap_allocator
- ;;
malloc)
ALLOCATOR_H=config/allocator/malloc_allocator_base.h
ALLOCATOR_NAME=__gnu_cxx::malloc_allocator
;;
- mt)
- ALLOCATOR_H=config/allocator/mt_allocator_base.h
- ALLOCATOR_NAME=__gnu_cxx::__mt_alloc
- ;;
new)
ALLOCATOR_H=config/allocator/new_allocator_base.h
ALLOCATOR_NAME=__gnu_cxx::new_allocator
;;
- pool)
- ALLOCATOR_H=config/allocator/pool_allocator_base.h
- ALLOCATOR_NAME=__gnu_cxx::__pool_alloc
- ;;
esac
GLIBCXX_CONDITIONAL(ENABLE_ALLOCATOR_NEW,
+++ /dev/null
-// Base to std::allocator -*- C++ -*-
-
-// Copyright (C) 2004-2021 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 3, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// Under Section 7 of GPL version 3, you are granted additional
-// permissions described in the GCC Runtime Library Exception, version
-// 3.1, as published by the Free Software Foundation.
-
-// You should have received a copy of the GNU General Public License and
-// a copy of the GCC Runtime Library Exception along with this program;
-// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
-// <http://www.gnu.org/licenses/>.
-
-/** @file bits/c++allocator.h
- * This is an internal header file, included by other library headers.
- * Do not attempt to use it directly. @headername{memory}
- */
-
-#ifndef _GLIBCXX_CXX_ALLOCATOR_H
-#define _GLIBCXX_CXX_ALLOCATOR_H 1
-
-#include <ext/bitmap_allocator.h>
-
-#if __cplusplus >= 201103L
-namespace std
-{
- /**
- * @brief An alias to the base class for std::allocator.
- * @ingroup allocators
- *
- * Used to set the std::allocator base class to
- * __gnu_cxx::bitmap_allocator.
- *
- * @tparam _Tp Type of allocated object.
- */
- template<typename _Tp>
- using __allocator_base = __gnu_cxx::bitmap_allocator<_Tp>;
-}
-#else
-// Define bitmap_allocator as the base class to std::allocator.
-# define __allocator_base __gnu_cxx::bitmap_allocator
-#endif
-
-#endif
+++ /dev/null
-// Base to std::allocator -*- C++ -*-
-
-// Copyright (C) 2004-2021 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 3, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// Under Section 7 of GPL version 3, you are granted additional
-// permissions described in the GCC Runtime Library Exception, version
-// 3.1, as published by the Free Software Foundation.
-
-// You should have received a copy of the GNU General Public License and
-// a copy of the GCC Runtime Library Exception along with this program;
-// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
-// <http://www.gnu.org/licenses/>.
-
-/** @file bits/c++allocator.h
- * This is an internal header file, included by other library headers.
- * Do not attempt to use it directly. @headername{memory}
- */
-
-#ifndef _GLIBCXX_CXX_ALLOCATOR_H
-#define _GLIBCXX_CXX_ALLOCATOR_H 1
-
-#include <ext/mt_allocator.h>
-
-#if __cplusplus >= 201103L
-namespace std
-{
- /**
- * @brief An alias to the base class for std::allocator.
- * @ingroup allocators
- *
- * Used to set the std::allocator base class to
- * __gnu_cxx::__mt_alloc.
- *
- * @tparam _Tp Type of allocated object.
- */
- template<typename _Tp>
- using __allocator_base = __gnu_cxx::__mt_alloc<_Tp>;
-}
-#else
-// Define __mt_alloc as the base class to std::allocator.
-# define __allocator_base __gnu_cxx::__mt_alloc
-#endif
-
-#endif
+++ /dev/null
-// Base to std::allocator -*- C++ -*-
-
-// Copyright (C) 2004-2021 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 3, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// Under Section 7 of GPL version 3, you are granted additional
-// permissions described in the GCC Runtime Library Exception, version
-// 3.1, as published by the Free Software Foundation.
-
-// You should have received a copy of the GNU General Public License and
-// a copy of the GCC Runtime Library Exception along with this program;
-// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
-// <http://www.gnu.org/licenses/>.
-
-/** @file bits/c++allocator.h
- * This is an internal header file, included by other library headers.
- * Do not attempt to use it directly. @headername{memory}
- */
-
-#ifndef _GLIBCXX_CXX_ALLOCATOR_H
-#define _GLIBCXX_CXX_ALLOCATOR_H 1
-
-#include <ext/pool_allocator.h>
-
-#if __cplusplus >= 201103L
-namespace std
-{
- /**
- * @brief An alias to the base class for std::allocator.
- * @ingroup allocators
- *
- * Used to set the std::allocator base class to
- * __gnu_cxx::__pool_alloc.
- *
- * @tparam _Tp Type of allocated object.
- */
- template<typename _Tp>
- using __allocator_base = __gnu_cxx::__pool_alloc<_Tp>;
-}
-#else
-// Define __pool_alloc as the base class to std::allocator.
-# define __allocator_base __gnu_cxx::__pool_alloc
-#endif
-
-#endif
if test "${enable_libstdcxx_allocator+set}" = set; then :
enableval=$enable_libstdcxx_allocator;
case "$enableval" in
- new|malloc|mt|bitmap|pool|yes|no|auto) ;;
+ new|malloc|yes|no|auto) ;;
*) as_fn_error $? "Unknown argument to enable/disable libstdcxx-allocator" "$LINENO" 5 ;;
esac
# Set configure bits for specified locale package
case ${enable_libstdcxx_allocator_flag} in
- bitmap)
- ALLOCATOR_H=config/allocator/bitmap_allocator_base.h
- ALLOCATOR_NAME=__gnu_cxx::bitmap_allocator
- ;;
malloc)
ALLOCATOR_H=config/allocator/malloc_allocator_base.h
ALLOCATOR_NAME=__gnu_cxx::malloc_allocator
;;
- mt)
- ALLOCATOR_H=config/allocator/mt_allocator_base.h
- ALLOCATOR_NAME=__gnu_cxx::__mt_alloc
- ;;
new)
ALLOCATOR_H=config/allocator/new_allocator_base.h
ALLOCATOR_NAME=__gnu_cxx::new_allocator
;;
- pool)
- ALLOCATOR_H=config/allocator/pool_allocator_base.h
- ALLOCATOR_NAME=__gnu_cxx::__pool_alloc
- ;;
esac
The <code class="function">std::unexpected</code> function and related typedef and
accessors for the unexpected handler are deprecated for C++11 and later.
Dynamic exception specifications should be replaced with <code class="code">noexcept</code>.
+</p><p>
+The <code class="literal">bitmap</code>, <code class="literal">mt</code>, and <code class="literal">pool</code>
+options for <code class="option">--enable-libstdcxx-allocator</code> were removed.
</p></div></div><div class="navfooter"><hr /><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="abi.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="appendix_porting.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="backwards.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">ABI Policy and Guidelines </td><td width="20%" align="center"><a accesskey="h" href="../index.html">Home</a></td><td width="40%" align="right" valign="top"> Backwards Compatibility</td></tr></table></div></body></html>
\ No newline at end of file
<code class="code">'--enable-libstdcxx-allocator=auto'</code> (described
next).
</p></dd><dt><span class="term"><code class="code">--enable-libstdcxx-allocator=OPTION </code></span></dt><dd><p>Select a target-specific underlying std::allocator. The
- choices are 'new' to specify a wrapper for new, 'malloc' to
- specify a wrapper for malloc, 'mt' for a fixed power of two allocator,
- 'pool' for the SGI pooled allocator or 'bitmap' for a bitmap allocator.
- See this page for more information on allocator
- <a class="link" href="memory.html#allocator.ext" title="Extension Allocators">extensions</a>. This option
- can change the library ABI.
+ choices are 'new' to specify a wrapper for new, and 'malloc' to
+ specify a wrapper for malloc.
+ See <a class="xref" href="memory.html#allocator.ext" title="Extension Allocators">the section called “Extension Allocators”</a> for more information.
+ This option can change the library ABI.
</p></dd><dt><span class="term"><code class="code">--enable-cheaders=OPTION</code></span></dt><dd><p>This allows the user to define the approach taken for C header
compatibility with C++. Options are c, c_std, and c_global.
These correspond to the source directory's include/c,
high-speed extension allocators, covered below. Thus, all
allocation and deallocation depends on the base class.
</p><p>
- The base class that <code class="classname">allocator</code> is derived from
- may not be user-configurable.
+ The choice of base class that <code class="classname">allocator</code>
+ is derived from is fixed at the time when GCC is built,
+ and the different choices are not ABI compatible.
</p></div><div class="section"><div class="titlepage"><div><div><h5 class="title"><a id="allocator.default"></a>Selecting Default Allocation Policy</h5></div></div></div><p>
It's difficult to pick an allocation strategy that will provide
maximum utility, without excessively penalizing some behavior. In
Probably the best place to start would be to copy one of the
extension allocators: say a simple one like
<code class="classname">new_allocator</code>.
+ </p><p>
+ Since C++11 the minimal interface require for an allocator is
+ much smaller, as <code class="classname">std::allocator_traits</code>
+ can provide default for much of the interface.
</p></div><div class="section"><div class="titlepage"><div><div><h4 class="title"><a id="allocator.ext"></a>Extension Allocators</h4></div></div></div><p>
Several other allocators are provided as part of this
implementation. The location of the extension allocators and their
</p></li><li class="listitem"><p>
<code class="classname">debug_allocator</code>
</p><p>
- A wrapper around an arbitrary allocator A. It passes on
- slightly increased size requests to A, and uses the extra
- memory to store size information. When a pointer is passed
+ A wrapper around an arbitrary allocator <code class="classname">A</code>.
+ It passes on slightly increased size requests to <code class="classname">A</code>,
+ and uses the extra memory to store size information.
+ When a pointer is passed
to <code class="function">deallocate()</code>, the stored size is
checked, and <code class="function">assert()</code> is used to
guarantee they match.
request is passed to <code class="function">::operator new</code>
directly.
</p><p>
- Older versions of this class take a boolean template
- parameter, called <code class="varname">thr</code>, and an integer template
- parameter, called <code class="varname">inst</code>.
+ For thread-enabled configurations, the pool is locked with a
+ single big lock. In some situations, this implementation detail
+ may result in severe performance degradation.
</p><p>
- The <code class="varname">inst</code> number is used to track additional memory
- pools. The point of the number is to allow multiple
- instantiations of the classes without changing the semantics at
- all. All three of
- </p><pre class="programlisting">
- typedef __pool_alloc<true,0> normal;
- typedef __pool_alloc<true,1> private;
- typedef __pool_alloc<true,42> also_private;
- </pre><p>
- behave exactly the same way. However, the memory pool for each type
- (and remember that different instantiations result in different types)
- remains separate.
- </p><p>
- The library uses <span class="emphasis"><em>0</em></span> in all its instantiations. If you
- wish to keep separate free lists for a particular purpose, use a
- different number.
- </p><p>The <code class="varname">thr</code> boolean determines whether the
- pool should be manipulated atomically or not. When
- <code class="varname">thr</code> = <code class="constant">true</code>, the allocator
- is thread-safe, while <code class="varname">thr</code> =
- <code class="constant">false</code>, is slightly faster but unsafe for
- multiple threads.
- </p><p>
- For thread-enabled configurations, the pool is locked with a
- single big lock. In some situations, this implementation detail
- may result in severe performance degradation.
- </p><p>
- (Note that the GCC thread abstraction layer allows us to provide
- safe zero-overhead stubs for the threading routines, if threads
- were disabled at configuration time.)
- </p></li><li class="listitem"><p>
+ (Note that the GCC thread abstraction layer allows us to provide
+ safe zero-overhead stubs for the threading routines, if threads
+ were disabled at configuration time.)
+ </p></li><li class="listitem"><p>
<code class="classname">__mt_alloc</code>
</p><p>
A high-performance fixed-size allocator with
</p><div class="section"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="allocator.mt.intro"></a>Intro</h2></div></div></div><p>
The mt allocator [hereinafter referred to simply as "the allocator"]
is a fixed size (power of two) allocator that was initially
- developed specifically to suit the needs of multi threaded
+ developed specifically to suit the needs of multi-threaded
applications [hereinafter referred to as an MT application]. Over
time the allocator has evolved and been improved in many ways, in
- particular it now also does a good job in single threaded
- applications [hereinafter referred to as a ST application]. (Note:
- In this document, when referring to single threaded applications
+ particular it now also does a good job in single-threaded
+ applications [hereinafter referred to as an ST application]. (Note:
+ In this document, when referring to single-threaded applications
this also includes applications that are compiled with gcc without
thread support enabled. This is accomplished using ifdef's on
__GTHREADS). This allocator is tunable, very flexible, and capable
</para>
<para>
- The base class that <classname>allocator</classname> is derived from
- may not be user-configurable.
+ The choice of base class that <classname>allocator</classname>
+ is derived from is fixed at the time when GCC is built,
+ and the different choices are not ABI compatible.
</para>
</section>
<classname>new_allocator</classname>.
</para>
+ <para>
+ Since C++11 the minimal interface require for an allocator is
+ much smaller, as <classname>std::allocator_traits</classname>
+ can provide default for much of the interface.
+ </para>
+
+
</section>
<section xml:id="allocator.ext"><info><title>Extension Allocators</title></info>
<classname>debug_allocator</classname>
</para>
<para>
- A wrapper around an arbitrary allocator A. It passes on
- slightly increased size requests to A, and uses the extra
- memory to store size information. When a pointer is passed
+ A wrapper around an arbitrary allocator <classname>A</classname>.
+ It passes on slightly increased size requests to <classname>A</classname>,
+ and uses the extra memory to store size information.
+ When a pointer is passed
to <function>deallocate()</function>, the stored size is
checked, and <function>assert()</function> is used to
guarantee they match.
</para>
<para>
- Older versions of this class take a boolean template
- parameter, called <varname>thr</varname>, and an integer template
- parameter, called <varname>inst</varname>.
+ For thread-enabled configurations, the pool is locked with a
+ single big lock. In some situations, this implementation detail
+ may result in severe performance degradation.
</para>
<para>
- The <varname>inst</varname> number is used to track additional memory
- pools. The point of the number is to allow multiple
- instantiations of the classes without changing the semantics at
- all. All three of
+ (Note that the GCC thread abstraction layer allows us to provide
+ safe zero-overhead stubs for the threading routines, if threads
+ were disabled at configuration time.)
</para>
-
- <programlisting>
- typedef __pool_alloc<true,0> normal;
- typedef __pool_alloc<true,1> private;
- typedef __pool_alloc<true,42> also_private;
- </programlisting>
- <para>
- behave exactly the same way. However, the memory pool for each type
- (and remember that different instantiations result in different types)
- remains separate.
- </para>
- <para>
- The library uses <emphasis>0</emphasis> in all its instantiations. If you
- wish to keep separate free lists for a particular purpose, use a
- different number.
- </para>
- <para>The <varname>thr</varname> boolean determines whether the
- pool should be manipulated atomically or not. When
- <varname>thr</varname> = <constant>true</constant>, the allocator
- is thread-safe, while <varname>thr</varname> =
- <constant>false</constant>, is slightly faster but unsafe for
- multiple threads.
- </para>
-
- <para>
- For thread-enabled configurations, the pool is locked with a
- single big lock. In some situations, this implementation detail
- may result in severe performance degradation.
- </para>
-
- <para>
- (Note that the GCC thread abstraction layer allows us to provide
- safe zero-overhead stubs for the threading routines, if threads
- were disabled at configuration time.)
- </para>
</listitem>
<listitem>
<varlistentry><term><code>--enable-libstdcxx-allocator=OPTION </code></term>
<listitem><para>Select a target-specific underlying std::allocator. The
- choices are 'new' to specify a wrapper for new, 'malloc' to
- specify a wrapper for malloc, 'mt' for a fixed power of two allocator,
- 'pool' for the SGI pooled allocator or 'bitmap' for a bitmap allocator.
- See this page for more information on allocator
- <link linkend="allocator.ext">extensions</link>. This option
- can change the library ABI.
+ choices are 'new' to specify a wrapper for new, and 'malloc' to
+ specify a wrapper for malloc.
+ See <xref linkend="allocator.ext"/> for more information.
+ This option can change the library ABI.
</para>
</listitem></varlistentry>
Dynamic exception specifications should be replaced with <code>noexcept</code>.
</para>
+<para>
+The <literal>bitmap</literal>, <literal>mt</literal>, and <literal>pool</literal>
+options for <option>--enable-libstdcxx-allocator</option> were removed.
+</para>
+
</section>
</section>
<para>
The mt allocator [hereinafter referred to simply as "the allocator"]
is a fixed size (power of two) allocator that was initially
- developed specifically to suit the needs of multi threaded
+ developed specifically to suit the needs of multi-threaded
applications [hereinafter referred to as an MT application]. Over
time the allocator has evolved and been improved in many ways, in
- particular it now also does a good job in single threaded
- applications [hereinafter referred to as a ST application]. (Note:
- In this document, when referring to single threaded applications
+ particular it now also does a good job in single-threaded
+ applications [hereinafter referred to as an ST application]. (Note:
+ In this document, when referring to single-threaded applications
this also includes applications that are compiled with gcc without
thread support enabled. This is accomplished using ifdef's on
__GTHREADS). This allocator is tunable, very flexible, and capable