Standard C ++ knihovny hlavičky na GNU gcc místě




Chci procházet zdrojového kódu GNU implementace Standard C ++ knihovny - hlavičkové soubory, jakož i provádění. Jsem přistál jsem se do:


<http://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.4/index.html>


Mým prvním krokem bylo dívat hlavičkový soubor na adrese:


<http://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.4/a01376.html>


Moje otázka je, že dle mého chápání typedeffed řetězec tá jako: typedef basic\_string řetězec; by měly být přítomny v záhlaví řetězce, ale nevidím jej zde.


Otázky: --in, který soubor je definice řetězce symbol? --I vidět, že záhlaví souboru řetězec obsahuje hodně mnoho záhlaví a je-li typedeffed symbol sring je definován v jednom z těchto interních hlaviček, je tam hledat bar něco na těchto stránkách přes které mohu dosáhnout na definici symbolu hned. (V případě, že již někdo procházet věci z této stránky dříve)


Díky, Jagrati
Mnoho libstdc ++ je realizována pouze hlavičky, ale některé části STK, stejně jako `std::basic_string`, které sestavují implementace.


Deklarace šablony `std::basic_string`se nachází v `/usr/include/c++/4.4.4/bits/basic_string.h`(nahradit ‚4.4.4‘ s `g++ -dumpversion`) a implementace je `/usr/include/c++/4.4.4/bits/basic_string.tcc`. Skutečná `typedef`of `std::string`, `std::wstring`atd je `.../bits/stringfwd.h`. Máte-li potřeba vytvořit instanci `std::basic_string`s ostatními parametry šablon, například, pak se něco takového:



```
#include <bits/basic_string.tcc>

template class std::basic_string<long>;

```

Způsob, jakým libstdc ++ implementuje sad a map (header-only) je docela zajímavé, ale také velmi složitý, protože používá implementaci vlastního červeno-černý strom ( `_Rb_tree`).


Libstdc ++ implementace `std::vector`(také header-only) je soběstačný, takže to stojí za pohled do `/usr/include/c++/4.4.4/bits/stl_vector.h`dát vám představu o internals libstdc ++. Další zajímavý soubor `.../bits/stl_algo.h`, který obsahuje definice STL algoritmy.


**Poznámka:** V systému Windows s MinGW, najdete na libstdc ++ záhlaví ve `lib\gcc\mingw32\4.4.0\include\c++\bits`vaší instalace MinGW, nahradí ‚4.4.0‘ se `g++ -dumpversion`.
<p>jsou zde dva společné a související význam tabulek symbolů.</p><p>nejdříve je ve vašich souborech objektů tabulka symbolů. obvykle kompilátor c nebo c++ kompiluje jeden zdrojový soubor do souboru objektu s příponou .obj nebo .o. obsahuje kolekci spustitelného kódu a dat, které může linker zpracovat do pracovní aplikace nebo sdílené knihovny. soubor objektu má v něm datovou strukturu nazvanou tabulku symbolů, která mapuje různé položky v souboru objektu na názvy, kterým může linker porozumět. pokud zavoláte funkci z vašeho kódu, kompilátor do souboru objektu neuvede konečnou adresu rutiny. místo toho vloží do kódu hodnotu zástupného symbolu a přidá poznámku, která říká linkerovi, aby vyhledal odkaz v různých tabulkách symbolů ze všech souborů objektů, které zpracovává, a umístí tam konečné umístění.</p><p>za druhé, je zde také tabulka symbolů ve sdílené knihovně nebo dll. to je vytvořeno linkerem a slouží k pojmenování všech funkcí a datových položek, které jsou viditelné pro uživatele knihovny. to umožňuje systému provádět propojování běhu a řešit otevřené odkazy na tyto názvy na místo, kde je knihovna načtena do paměti.</p><p>pokud se chcete dozvědět více, doporučuji vynikající knihu johna levina &quot;linkers and loaders&quot; . <a href="http://books.google.com/books?id=h34d\_jr2iikc&amp;dq=levine+linkers+and+loaders&amp;pg=pp1&amp;ots=ixgckqo03w&amp;sig=dduacrrhk6e2nmlktxbnedpwbtg&amp;hl=en&amp;sa=x&amp;oi=book\_result&amp;resnum=1&amp;ct=result">link text</a> </p> <p>v c++ existují tři <em> odlišné </em> typy znaků:</p><ul> <li><code>char</code>name\_\_</li> <li><code>signed char</code></li> <li><code>unsigned char</code></li> </ul><p>pokud používáte textové znaky pro text <em> </em>, použijte nekvalifikovaný <code>char</code>name\_\_:</p><ul> <li>je to typ znakových literálů jako <code>'a'</code> nebo <code>'0'</code>.</li> <li>je to typ, který tvoří řetězce c jako <code>"abcde"</code></li> </ul><p>funguje také jako číselná hodnota, ale není specifikováno, zda je s touto hodnotou zacházeno jako s podepsanou nebo nepodepsanou hodnotou. dávejte si pozor na porovnání postav prostřednictvím nerovností - i když pokud se omezíte na ascii (0-127), jste jen v bezpečí.</p><p>pokud používáte typy znaků jako <em> čísla </em>, použijte:</p><ul> <li><code>signed char</code>, což vám dává <em> alespoň </em> rozsah -127 až 127. (-128 až 127 je běžné)</li> <li><code>unsigned char</code>, což vám dává <em> alespoň </em> rozsah 0 až 255.</li> </ul><p>„alespoň“, protože standard c++ poskytuje pouze minimální rozsah hodnot, které musí každý číselný typ pokrýt. <code>sizeof (char)</code> musí být 1 (tj. jeden byte), ale byte by teoreticky mohl být například 32 bitů. <strong><code>sizeof</code>name\_\_ by i nadále vykazoval svou velikost jako <code>1</code></strong> - což znamená, že <em> můžete </em> mít <code>sizeof (char) == sizeof (long) == 1</code>.</p> <p>kapitola 11 knihy <a href="http://rads.stackoverflow.com/amzn/click/0596514808">intel threading building blocks</a> autor james reinders se věnuje příkladům algoritmů a projektů, které využívají <a href="http://en.wikipedia.org/wiki/parallel\_computing">parallel computing</a> (nebo parallel programming): finder podřetězců, game of life, sieve of eratosthenes, matrix multiply a další pokročilejší témata, jako je filtrování síťových paketů a hry.</p> <p>myslím, že znamenají, že byste měli používat <a href="http://en.wikipedia.org/wiki/smart\_pointer">inteligentní ukazatele</a> místo běžných ukazatelů.</p><blockquote> <p>ve vědě o počítačích je inteligentní ukazatel abstraktní datový typ, který simuluje ukazatel a zároveň poskytuje další funkce, jako je automatický sběr odpadu nebo kontrola mezí. účelem těchto dalších funkcí je omezit chyby způsobené zneužitím ukazatelů při zachování účinnosti. inteligentní ukazatele obvykle sledují objekty, na které ukazují, za účelem správy paměti.</p> <p>zneužití ukazatelů je hlavním zdrojem chyb: konstantní alokace, deallokace a odkazování, které musí být provedeny programem napsaným pomocí ukazatelů, představuje riziko, že dojde k úniku paměti. inteligentní ukazatele se pokoušejí zabránit úniku paměti automatizováním automatického přidělování prostředků: když je ukazatel (nebo poslední v řadě ukazatelů) na objekt zničen, například proto, že je mimo rozsah, je zničen i špičatý objekt.</p> </blockquote><p>v c++ by byl kladen důraz na sběr odpadu a zabránění úniku paměti (abychom jmenovali alespoň dvě). ukazatele jsou základní součástí jazyka, takže jejich použití je do značné míry nemožné, s výjimkou nejvzácnějších programů.</p> <p>v 80. letech, kdy se vývoj c++ teprve začínal, byl c++ téměř správným supersetem c. takto to všechno začalo.<br> postupem času se však c a c++ vyvíjely a od sebe navzájem se lišily, přestože kompatibilita mezi jazyky je vždy považována za důležitou.</p><p>kromě toho technické rozdíly mezi c a c++ způsobily, že typické idiomy v těchto jazycích a to, co se považuje za „osvědčené postupy“, se ještě více liší.</p><p>to je hnací faktor lidí, kteří říkají věci jako „neexistuje žádný takový jazyk jako c/c++“ nebo „c a c++ jsou dva různé jazyky“. přestože je možné psát programy, které jsou přijatelné pro kompilátor c i c++, kód se obecně nepovažuje za příklad dobrého kódu c ani za příklad dobrého kódu c++.</p> <p>ve skutečnosti to není samo o sobě vzorec uživatelského rozhraní, ale gmail a google reader v zásadě standardizovaly toto chování ve webových aplikacích a od té doby jsem se ho snažil sledovat:</p><ul> <li>žádné vstupní pole konkrétně; stačí nechat aplikaci reagovat na stisknutí kláves po celou dobu (s výjimkou zaměření na vstupní pole)</li> <li>typ? (shift + /) otevřete překrytí klávesové zkratky kdekoli v aplikaci.</li> <li>j &amp; k pro pohyb vpřed a vzad v kontextu, jako jsou e-maily nebo položky rss</li> <li>sekvence: například zadáním „g“ následovaným „i“ v gmailu „přejde“ do „doručené“</li> <li>namapujte co nejvíce klávesových zkratek na klávesy odpovídající akci, což by mělo pomoci zapamatování. "c" v gmailu znamená "napsat". výjimky z tohoto pravidla: další převažující konvence, jako jsou výše uvedené klíče j/k.</li> </ul><p>funkce „sekvence“ umožňuje reagovat na jednotlivá stisknutí kláves, aniž by uživatelé museli psát slova, a to (teoreticky) vám dává neomezené kombinace stisknutí kláves, protože máte tucet možností na klávesu v sekvenci. v této architektuře byste měli být schopni implementovat většinu příkazů, které chcete.</p><p>opravdu se mi líbí, jak to google implementoval - je příliš špatné, že to opravdu někde extrapolovali na návrhové vzory (pokud to neudělali a já mi to chybělo). bylo by hezké vidět více aplikací sledovat trend, který nastavily.</p> <p>vypadá to, že kódujete v jazyce c #, který má metodu nazvanou equals, kterou by vaše třída měla implementovat, pokud chcete porovnat dva objekty s použitím jiné metriky než „jsou tyto dva ukazatele (protože popisovače objektů jsou právě to, ukazatele) na stejnou adresu paměti? &quot;.</p><p>chytil jsem pár ukázkových kódů z <a href="http://msdn.microsoft.com/en-us/library/ms173147(vs.80).aspx">zde</a> :</p><pre><code>class twodpoint : system.object { public readonly int x, y; public twodpoint(int x, int y) //constructor { this.x = x; this.y = y; } public override bool equals(system.object obj) { // if parameter is null return false. if (obj == null) { return false; } // if parameter cannot be cast to point return false. twodpoint p = obj as twodpoint; if ((system.object)p == null) { return false; } // return true if the fields match: return (x == p.x) &amp;&amp; (y == p.y); } public bool equals(twodpoint p) { // if parameter is null return false: if ((object)p == null) { return false; } // return true if the fields match: return (x == p.x) &amp;&amp; (y == p.y); } public override int gethashcode() { return x ^ y; } } </code></pre><p>java má velmi podobné mechanismy. metoda<em> equals () </em>je součástí třídy<em> object </em>/ a vaše třída ji přetěžuje, pokud chcete tento typ funkce.</p><p>důvodem přetížení '==' může být špatný nápad pro objekty je to, že obvykle stále chcete být schopni udělat &quot;jsou tyto stejné ukazatel&quot; srovnání. obvykle se na ně spoléhá například při vkládání prvku do seznamu, kde nejsou povoleny žádné duplikáty, a některé z vašich částí systému nemusí fungovat, pokud je tento operátor přetížen nestandardním způsobem.</p> <p>použít <a href="http://msdn.microsoft.com/en-us/library/system.io.stringwriter.aspx"><code>stringwriter</code></a> namísto souboru <a href="http://msdn.microsoft.com/en-us/library/system.io.streamwriter.aspx"><code>streamwriter</code></a> :</p><pre><code>public static string serializeobject&lt;t&gt;(this t toserialize) { xmlserializer xmlserializer = new xmlserializer(toserialize.gettype()); using(stringwriter textwriter = new stringwriter()) { xmlserializer.serialize(textwriter, toserialize); return textwriter.tostring(); } } </code></pre><p>poznámka: je důležité použít <code>toserialize.gettype()</code> namísto <code>typeof(t)</code> v konstruktoru xmlserializer: pokud použijete první, kód pokrývá všechny možné podtřídy <code>t</code> (které jsou pro metodu platné), zatímco druhý z nich selže při předávání typu odvozeného z <code>t</code>. zde je odkaz s nějakým příkladem kódu, který motivuje toto prohlášení, s <code>xmlserializer</code> házením <code>exception</code>, když je <code>typeof(t)</code> použito, protože předáte instanci odvozeného typu metodě, která volá serializeobject, který je definované v základní třídě odvozeného typu: <a href="http://ideone.com/1z5j1">http://ideone.com/1z5j1</a> .</p><p>ideone také používá mono ke spuštění kódu; skutečný <code>exception</code> byste dostali pomocí runtime microsoft .net má jiný <code>message</code> než ten, který je zobrazen na ideone, ale to selže stejně.</p> <p>jednoduše poskytnete všechny vzory pro <code>-i</code> příkaz oddělený <code>|</code>. z manpage:</p><pre><code>-p pattern list only those files that match the wild-card pattern. note: you must use the -a option to also consider those files begin‐ ning with a dot `.' for matching. valid wildcard operators are `*' (any zero or more characters), `?' (any single character), `[...]' (any single character listed between brackets (optional - (dash) for character range may be used: ex: [a-z]), and `[^...]' (any single character not listed in brackets) and `|' separates alternate patterns. -i pattern do not list those files that match the wild-card pattern. </code></pre><p>tak například</p><pre><code>tree -i 'test*|docs|bin|lib' </code></pre><p>přeskočí adresáře „docs“, „bin“ a „lib“ a jakýkoli adresář s názvem „test“ v názvu, kdekoli se mohou nacházet v hierarchii adresářů. samozřejmě můžete použít zástupné znaky pro mnohem silnější shodu.</p> <p>uuid (universally unique identifier), také známý jako guid (globally unique identifier), jsou podle <a href="https://www.ietf.org/rfc/rfc4122.txt">rfc 4122</a> , identifikátory s jistou jistotou.</p><p>nejlepším způsobem, jak je vygenerovat, je dodržovat instrukce k implementaci v uvedené rfc, použít jednu z mnoha komunitně ověřených implementací open source, nebo pro jazyky, které ji mají, použít vestavěnou implementaci.</p><p>některé příklady open source nástrojů pro práci s uuids, pro některé populární programovací jazyky jsou vypsány tady.</p><p><strong>javascript</strong></p><ul> <li> <a href="https://github.com/kelektiv/node-uuid">https://github.com/kelektiv/node-uuid</a> </li> </ul><p><strong>php</strong></p><ul> <li> <a href="https://github.com/ramsey/uuid">https://github.com/ramsey/uuid</a> </li> </ul><p><strong>jít</strong></p><ul> <li> <a href="https://github.com/satori/go.uuid">https://github.com/satori/go.uuid</a> </li> </ul><p><strong>ruby</strong></p><ul> <li>část <a href="https://ruby-doc.org/stdlib-2.6/libdoc/securerandom/rdoc/random/formatter.html#method-i-uuid">standardní knihovna</a> </li> </ul><p><strong>python</strong></p><ul> <li>v modulu <a href="https://docs.python.org/3/library/uuid.html">uuid</a> </li> </ul><hr><p>všimněte si, že právě náhodně generování identifikátorů bajtů po bajtech nebo znak po znaku vám nedává stejné záruky jako vyhovující implementace. velmi důležité je také to, že systémy pracující s kompatibilními uuid se mohou rozhodnout nepřijímat náhodně generované systémy a mnoho validátorů s otevřeným zdrojovým kódem skutečně zkontroluje platnou strukturu.</p><p>uuid musí mít tento formát:</p><pre><code>xxxxxxxx-xxxx-mxxx-nxxx-xxxxxxxxxxxx </code></pre><p>kde pozice <em>m</em> a <em>n</em> mohou mít pouze určité hodnoty. v tuto chvíli jsou jediné platné hodnoty pro m 1, 2, 3, 4 a 5, takže náhodně generování této pozice by učinilo většinu výsledků nepřijatelnými.</p>