Где заголовки стандартной библиотеки C ++

Интересно, где в моей файловой системе я нахожу заголовки стандартной библиотеки C ++. В частности, я ищу определение векторного шаблона. Я искал в / usr / include / и различных подкаталогах. Я также попробовал «locate vector.h», который вызвал множество реализаций векторов, но не стандартную. Что мне не хватает? (Дистрибутив Gentoo)

Предыстория: я профилирую библиотеку, которая большую часть времени выполняет итерацию по вектору, и gprof показывает, что большую часть времени тратится на

std::vector<int, std::allocator<int> >::_M_insert_aux(
  __gnu_cxx::__normal_iterator<int*, std::vector<
      int, std::allocator<int> > >, int const&)

Вероятно, это то, что происходит внутри std :: vector :: push_back, но я не уверен.


person Thomas    schedule 12.07.2012    source источник
comment
Почему вы ищете vector в разделе C?   -  person genpfault    schedule 12.07.2012


Ответы (6)


GCC обычно имеет стандартные заголовки C ++, установленные в /usr/include/c++/<version>/. Вы можете запустить gcc -v, чтобы узнать, какая версия у вас установлена.

По крайней мере, в моей версии нет vector.h; публичный заголовок - это просто vector (без расширения), и большая часть реализации находится в bits/stl_vector.h.

Так обстоит дело с моим дистрибутивом Ubuntu; ваш дистрибутив может отличаться.

person Mike Seymour    schedule 12.07.2012
comment
Спасибо, отсутствующий .h является важным намеком. В Gentoo он находится в /usr/lib64/gcc/x86_64-pc-linux-gnu/4.5.3/include/g++-v4/vector - person Thomas; 12.07.2012

Запуск g++ -v -v -v выводит множество вещей, включая все найденные каталоги include. vector находится в одном из таких.

person R. Martinho Fernandes    schedule 12.07.2012

В моей стабильной системе Debian vector находится здесь:

/usr/include/c++/4.4/vector
person genpfault    schedule 12.07.2012
comment
Это vector.h? Какой пакет это предоставляет? gcc? - person Thomas; 12.07.2012

При "простой" установке ubuntu вам необходимо установить

libstdc++- версия -dev

чтобы получить файлы заголовков.

затем, проверив установленные файлы, вы получите путь!

person jo_    schedule 23.08.2013

Во многих IDE (например, NetBeans) вы можете использовать Ctrl+Click для className, чтобы перейти к определению

person RiaD    schedule 12.07.2012

Расположение файла фактически зависит от компилятора.

Вы можете использовать инструмент bash "locate" для поиска любых файлов, которые, как вы знаете, находятся в библиотеке. например. "locate stl_multimap.h" для меня дает:

/usr/include/c++/5/bits/stl_multimap.h
/usr/include/c++/6/bits/stl_multimap.h
/usr/include/c++/7/bits/stl_multimap.h
/usr/include/c++/8/bits/stl_multimap.h
/usr/lib/gcc-snapshot/include/c++/9/bits/stl_multimap.h

Как только вы посмотрите на каталоги, станет довольно очевидно, где находится все остальное.

В каждом из этих мест я найду разные версии файла для компилятора. На моем компьютере все файлы gcc 7. * находятся в моем каталоге /usr/include/c++/7.

Если по какой-то ужасной причине вы используете Windows, я уверен, что вы сможете найти эквивалентную команду с Powershell.

person Elliott    schedule 13.12.2019