index.html revision f5d76a7afce1d593634004566066c8e593a14ade
1d2bb03207523e55aa2423570bcaaad03e779450cHoward Hinnant<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
2bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant          "http://www.w3.org/TR/html4/strict.dtd">
3bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant<!-- Material used from: HTML 4.01 specs: http://www.w3.org/TR/html401/ -->
4bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant<html>
5bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant<head>
6bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  <META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
7bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  <title>"libc++" C++ Standard Library</title>
8bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  <link type="text/css" rel="stylesheet" href="menu.css">
9bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  <link type="text/css" rel="stylesheet" href="content.css">
10bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant</head>
11bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
12bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant<body>
13bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant<div id="menu">
14bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  <div>
15bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    <a href="http://llvm.org/">LLVM Home</a>
16bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  </div>
17d2bb03207523e55aa2423570bcaaad03e779450cHoward Hinnant
18bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  <div class="submenu">
19bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    <label>libc++ Info</label>
20bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    <a href="/index.html">About</a>
21bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  </div>
22bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
23bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  <div class="submenu">
24bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    <label>Quick Links</label>
25a535ffd99d3702ab065647e28e83c2b7d720be3dChris Lattner    <a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev">cfe-dev</a>
26a535ffd99d3702ab065647e28e83c2b7d720be3dChris Lattner    <a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits">cfe-commits</a>
27bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    <a href="http://llvm.org/bugs/">Bug Reports</a>
2876e1ffc6036a7e772827228e4626280caddbc354Howard Hinnant    <a href="http://llvm.org/svn/llvm-project/libcxx/trunk/">Browse SVN</a>
2976e1ffc6036a7e772827228e4626280caddbc354Howard Hinnant    <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/">Browse ViewVC</a>
30bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  </div>
31bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant</div>
32bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
33bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant<div id="content">
34bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  <!--*********************************************************************-->
35bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  <h1>"libc++" C++ Standard Library</h1>
36bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  <!--*********************************************************************-->
37d2bb03207523e55aa2423570bcaaad03e779450cHoward Hinnant
38bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  <p>libc++ is a new implementation of the C++ standard library, targeting
39bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant     C++0X.</p>
40bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
41f38bc6efc52ff2c773582d5b62dd53aaa92c186cChris Lattner  <p>All of the code in libc++ is <a
42f38bc6efc52ff2c773582d5b62dd53aaa92c186cChris Lattner     href="http://llvm.org/docs/DeveloperPolicy.html#license">dual licensed</a>
43f38bc6efc52ff2c773582d5b62dd53aaa92c186cChris Lattner     under the MIT license and the UIUC License (a BSD-like license).</p>
44d2bb03207523e55aa2423570bcaaad03e779450cHoward Hinnant
45bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  <!--=====================================================================-->
46bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  <h2 id="goals">Features and Goals</h2>
47bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  <!--=====================================================================-->
48d2bb03207523e55aa2423570bcaaad03e779450cHoward Hinnant
49bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    <ul>
50bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        <li>Correctness as defined by the (currently draft) C++0X standard.</li>
51bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        <li>Fast execution.</li>
52bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        <li>Minimal memory use.</li>
53bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        <li>Fast compile times.</li>
54bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        <li>ABI compatibility with gcc's libstdc++ for some low-level features
55bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            such as exception objects, rtti and memory allocation.</li>
56bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        <li>Extensive unit tests.</li>
57bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    </ul>
58bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
59bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  <!--=====================================================================-->
6024173b81dd527a38b32e037082f7d1578213d626Chris Lattner  <h2 id="why">Why a new C++ Standard Library for C++'0x?</h2>
6124173b81dd527a38b32e037082f7d1578213d626Chris Lattner  <!--=====================================================================-->
62d2bb03207523e55aa2423570bcaaad03e779450cHoward Hinnant
6324173b81dd527a38b32e037082f7d1578213d626Chris Lattner  <p>After its initial introduction, many people have asked "why start a new
6424173b81dd527a38b32e037082f7d1578213d626Chris Lattner     library instead of contributing to an existing library?" (like Apache's
6524173b81dd527a38b32e037082f7d1578213d626Chris Lattner     libstdcxx, GNU's libstdc++, STLport, etc).  There are many contributing
6624173b81dd527a38b32e037082f7d1578213d626Chris Lattner     reasons, but some of the major ones are:</p>
67d2bb03207523e55aa2423570bcaaad03e779450cHoward Hinnant
6824173b81dd527a38b32e037082f7d1578213d626Chris Lattner  <ul>
6924173b81dd527a38b32e037082f7d1578213d626Chris Lattner  <li><p>From years of experience (including having implemented the standard
7024173b81dd527a38b32e037082f7d1578213d626Chris Lattner      library before), we've learned many things about implementing
7124173b81dd527a38b32e037082f7d1578213d626Chris Lattner      the standard containers which require ABI breakage and fundamental changes
7224173b81dd527a38b32e037082f7d1578213d626Chris Lattner      to how they are implemented.  For example, it is generally accepted that
7324173b81dd527a38b32e037082f7d1578213d626Chris Lattner      building std::string using the "short string optimization" instead of
7424173b81dd527a38b32e037082f7d1578213d626Chris Lattner      using Copy On Write (COW) is a superior approach for multicore
75a5058d9a0d5e60adcd9118dfe7f886effd6a6206Chris Lattner      machines (particularly in C++'0x, which has rvalue references).  Breaking
76a5058d9a0d5e60adcd9118dfe7f886effd6a6206Chris Lattner      ABI compatibility with old versions of the library was
7724173b81dd527a38b32e037082f7d1578213d626Chris Lattner      determined to be critical to achieving the performance goals of
7824173b81dd527a38b32e037082f7d1578213d626Chris Lattner      libc++.</p></li>
79d2bb03207523e55aa2423570bcaaad03e779450cHoward Hinnant
8024173b81dd527a38b32e037082f7d1578213d626Chris Lattner  <li><p>Mainline libstdc++ has switched to GPL3, a license which the developers
8124173b81dd527a38b32e037082f7d1578213d626Chris Lattner      of libc++ cannot use.  libstdc++ 4.2 (the last GPL2 version) could be
8224173b81dd527a38b32e037082f7d1578213d626Chris Lattner      independently extended to support C++'0x, but this would be a fork of the
83f33824922812487c1e7f24852975b0e06792eb7eChris Lattner      codebase (which is often seen as worse for a project than starting a new
84f33824922812487c1e7f24852975b0e06792eb7eChris Lattner      independent one).  Another problem with libstdc++ is that it is tightly
85f33824922812487c1e7f24852975b0e06792eb7eChris Lattner       integrated with G++ development, tending to be tied fairly closely to the
86f33824922812487c1e7f24852975b0e06792eb7eChris Lattner       matching version of G++.</p>
8724173b81dd527a38b32e037082f7d1578213d626Chris Lattner    </li>
8824173b81dd527a38b32e037082f7d1578213d626Chris Lattner
8924173b81dd527a38b32e037082f7d1578213d626Chris Lattner  <li><p>STLport and the Apache libstdcxx library are two other popular
9024173b81dd527a38b32e037082f7d1578213d626Chris Lattner      candidates, but both lack C++'0x support.  Our experience (and the
9124173b81dd527a38b32e037082f7d1578213d626Chris Lattner      experience of libstdc++ developers) is that adding support for C++0x (in
9224173b81dd527a38b32e037082f7d1578213d626Chris Lattner      particular rvalue references and move-only types) requires changes to
9324173b81dd527a38b32e037082f7d1578213d626Chris Lattner      almost every class and function, essentially amounting to a rewrite.
94bfa808e093b1bd53832a9aa245d27b1b95827bbfChris Lattner      Faced with a rewrite, we decided to start from scratch and evaluate every
95bfa808e093b1bd53832a9aa245d27b1b95827bbfChris Lattner      design decision from first principles based on experience.</p>
96d2bb03207523e55aa2423570bcaaad03e779450cHoward Hinnant
9724173b81dd527a38b32e037082f7d1578213d626Chris Lattner      <p>Further, both projects are apparently abandoned: STLport 5.2.1 was
9824173b81dd527a38b32e037082f7d1578213d626Chris Lattner      released in Oct'08, and STDCXX 4.2.1 in May'08.</p>
9924173b81dd527a38b32e037082f7d1578213d626Chris Lattner
10024173b81dd527a38b32e037082f7d1578213d626Chris Lattner    </ul>
10124173b81dd527a38b32e037082f7d1578213d626Chris Lattner
10224173b81dd527a38b32e037082f7d1578213d626Chris Lattner  <!--=====================================================================-->
103bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  <h2 id="requirements">Platform Support</h2>
104bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  <!--=====================================================================-->
105bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
106bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant   <p>libc++ is known to work on the following platforms, using g++-4.2 and
107bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      clang (lack of C++0X language support disables some functionality).</p>
108bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
109bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    <ul>
110bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant     <li>Mac OS X i386</li>
111bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant     <li>Mac OS X x86_64</li>
112bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    </ul>
113bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
114bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  <!--=====================================================================-->
115bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  <h2 id="dir-structure">Current Status</h2>
116bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  <!--=====================================================================-->
117bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
118f6547cbf61511c557d3780f736502cce0a06e69dHoward Hinnant   <p>libc++ is still under development.  It has about 98% of
119f6547cbf61511c557d3780f736502cce0a06e69dHoward Hinnant      <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3126.pdf">N3126</a>
12024173b81dd527a38b32e037082f7d1578213d626Chris Lattner      implemented/tested.  C++'98 support is fully featured, and most of C++'0x
121f6547cbf61511c557d3780f736502cce0a06e69dHoward Hinnant      support is as well.  The only major missing piece of C++'0x support is
122f6547cbf61511c557d3780f736502cce0a06e69dHoward Hinnant      <code>&lt;atomic&gt;</code>.</p>
123bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
124d0e811a37d2c263a602ace05648f9ecaf8b59663Howard Hinnant   <p><a href="libcxx_by_chapter.pdf">Here</a> is a by-chapter breakdown of what
125d0e811a37d2c263a602ace05648f9ecaf8b59663Howard Hinnant   is passing tests and what isn't. This chart is currently based on testing
1264b3a0887d0e1643022acab902a83e4e05836781cDan Gohman   against g++-4.4.0 with -std=c++0x. </p>
127d0e811a37d2c263a602ace05648f9ecaf8b59663Howard Hinnant
128bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  <!--=====================================================================-->
129bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  <h2>Get it and get involved!</h2>
130bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  <!--=====================================================================-->
131d2bb03207523e55aa2423570bcaaad03e779450cHoward Hinnant
132bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  <p>To check out the code, use:</p>
133d2bb03207523e55aa2423570bcaaad03e779450cHoward Hinnant
134bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  <ul>
1354b748953a2d51c34127aa9c593477966242e1898Chris Lattner  <li><code>svn co http://llvm.org/svn/llvm-project/libcxx/trunk libcxx</code></li>
13665451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant  </ul>
13765451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant
13865451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant  <p>To build on Mac OS X 10.6, you need a helper library and header 
13965451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant    <a href="http://home.roadrunner.com/~hinnant/libcppabi.zip">found here</a>.
14065451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant    cp cxxabi.h to /usr/include, and cp libc++abi.dylib to /usr/lib.
14165451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant    <p>
14265451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant    
14365451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant  <p>
14465451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant     Next:
14565451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant  </p>
14665451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant  
14765451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant  <ul>
14865451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant    <li><code>cd libcxx/lib</code></li>
14965451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant    <li><code>export TRIPLE=-apple-</code></li>
15065451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant    <li><code>/buildit</code></li>
15165451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant  </ul>
15265451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant  
15365451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant  <p>
15465451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant     That should result in a libc++.1.dylib.  To install it I like to use links
15565451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant     instead of copying, but either should work:
15665451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant  </p>
15765451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant
15865451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant  <ul>
15965451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant    <li><code>cd /usr/lib</code></li>
1605a245dbf526fb8edb6cdc350f6a0901663f09437Howard Hinnant    <li><code>sudo ln -sf path-to-libcxx/lib/libc++.1.dylib libc++.1.dylib</code></li>
1615a245dbf526fb8edb6cdc350f6a0901663f09437Howard Hinnant    <li><code>sudo ln -sf libc++.1.dylib libc++.dylib</code></li>
16265451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant    <li><code>cd /usr/include/c++</code></li>
16365451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant    <li><code>sudo ln -sf path-to-libcxx/include v1</code></li>
16465451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant  </ul>
16565451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant
16665451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant  <p>
16765451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant  To use with clang you can:
16865451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant  </p>
16965451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant
17065451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant  <ul>
17165451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant    <li><code>clang++ -stdlib=libc++ test.cpp</code></li>
17265451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant    <li><code>clang++ -std=c++0x -stdlib=libc++ test.cpp</code></li>
173bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  </ul>
174bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
175bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  <p>To run the libc++ test suit (recommended):</p>
176bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
177bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  <ul>
1784b748953a2d51c34127aa9c593477966242e1898Chris Lattner  <li><code>cd libcxx/test</code></li>
179bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  <li><code>/testit</code></li>
180f5d76a7afce1d593634004566066c8e593a14adeHoward Hinnant     <ul>
181f5d76a7afce1d593634004566066c8e593a14adeHoward Hinnant       <li><p>On Mac OS 10.6 add "-U__STRICT_ANSI__" to the command line with:</p>
182f5d76a7afce1d593634004566066c8e593a14adeHoward Hinnant           <blockquote><pre>
183f5d76a7afce1d593634004566066c8e593a14adeHoward Hinnantexport OPTIONS="-std=c++0x -stdlib=libc++ -U__STRICT_ANSI__"
184f5d76a7afce1d593634004566066c8e593a14adeHoward Hinnant           </pre></blockqutoe></li>
185f5d76a7afce1d593634004566066c8e593a14adeHoward Hinnant     </ul>
186bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  </ul>
187bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
188d2bb03207523e55aa2423570bcaaad03e779450cHoward Hinnant  <p>Send discussions to the
1898c21737c03f3b266d8679d56faa6b6d091e7f2f1Howard Hinnant  (<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev">clang mailing list</a>).</p>
1908c21737c03f3b266d8679d56faa6b6d091e7f2f1Howard Hinnant
19156f0d5be064ed82f439e1596a272237697077ec3Howard Hinnant  <!--=====================================================================-->
19256f0d5be064ed82f439e1596a272237697077ec3Howard Hinnant  <h2>Design Documents</h2>
19356f0d5be064ed82f439e1596a272237697077ec3Howard Hinnant  <!--=====================================================================-->
19456f0d5be064ed82f439e1596a272237697077ec3Howard Hinnant
19556f0d5be064ed82f439e1596a272237697077ec3Howard Hinnant<ul>
19656f0d5be064ed82f439e1596a272237697077ec3Howard Hinnant<li><a href="atomic_design.html"><tt>&lt;atomic&gt;</tt></a></li>
1979835d761695b7d54e7d231dd1fe682597f249349Howard Hinnant<li><a href="type_traits_design.html"><tt>&lt;type_traits&gt;</tt></a></li>
19856f0d5be064ed82f439e1596a272237697077ec3Howard Hinnant</ul>
19956f0d5be064ed82f439e1596a272237697077ec3Howard Hinnant
200bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant</div>
201bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant</body>
2024b748953a2d51c34127aa9c593477966242e1898Chris Lattner</html>
203