Я хотел посмотреть на реализацию различных функций C/C++ (например, strcpy, stcmp, strstr). Это поможет мне узнать хорошие методы кодирования в c/C++. Не могли бы вы сообщить мне, где я могу его найти?Исходный код функций c/C++
Спасибо.
Я хотел посмотреть на реализацию различных функций C/C++ (например, strcpy, stcmp, strstr). Это поможет мне узнать хорошие методы кодирования в c/C++. Не могли бы вы сообщить мне, где я могу его найти?Исходный код функций c/C++
Спасибо.
Вы можете проверить копию glibc, которая будет иметь исходный код для всех функций C в стандартной библиотеке C. Это должно быть хорошим стартовым местом.
Хотя это первый ответ, который приходит на ум, это может быть не лучшее место, чтобы узнать о «хороших методах кодирования», которые имеют общую применимость. Это связано с тем, что функции glibc имеют обоснованную причину для того, чтобы быть сильно оптимизированными по микро-оптимизации - даже оптимизация для платформы - просто потому, что они являются стандартными библиотечными функциями. Обычно это не хорошая практика для общего программирования. – caf
@mipadi Я щелкнул ссылку и пошел внутрь источников и проверил http://ftp.gnu.org/gnu/glibc/. В любом из файлов .tar.gz нет math.h. Я просто хочу посмотреть на sqrt(). Не писать оптимизированную функцию. Просто посмотреть, как C это – Jsmith
Многие функции стандартной библиотеки C имеют исходный код листинги & обсуждения в The C Programming Language by Kernighan & Ritchie. Обсуждения - это полезный способ узнать больше о специфике языка C & о том, как функции в стандартной библиотеке работают под капотом.
Многие функции в K & R показаны в упрощенной форме, но это может быть лучше, если они используются для примеров. –
K & R должен быть необходим для чтения для любого программирования в C. Очень немногие написали что-то настолько хорошее на стольких страницах. – NoMoreZealots
Это лучшее предложение, чем просмотр реальных библиотек. Они были написаны с целью обучения C, а не для того, чтобы иметь самую эффективную библиотеку C. – caf
Реализация будет несколько отличаться в зависимости от ОС OS, но реализация GNU/Linux, вероятно, будет самым легким, чтобы найти там.
Посмотрите на реализацию стандартной библиотеки C libc. Чтобы увидеть, как реализуется реальная, популярная библиотека C, попробуйте взглянуть на код glibc. Вы можете получить доступ к коду с помощью мерзавца:
GIT клон мерзавца: //sourceware.org/git/glibc.git
Что касается C++, вы можете найти GlibC++ стандартной библиотеки на одном из этих зеркал:
http://gcc.gnu.org/mirrors.html
Вы также можете проверить uLibc, который, вероятно, будет проще, чем библиотека GNU:
http://git.uclibc.org/uClibc/tree/
Чтобы дать вам вкус, вот реализация strncpy из uLibc:
Wchar *Wstrcpy(Wchar * __restrict s1, const Wchar * __restrict s2)
{
register Wchar *s = s1;
#ifdef __BCC__
do {
*s = *s2++;
} while (*s++ != 0);
#else
while ((*s++ = *s2++) != 0);
#endif
return s1;
}
Отличный пример того, почему реализация реализаций реальной библиотеки C не является хорошим руководством для общеприменимых хороших методов программирования - наличие этих двух слегка реконфигурированных версий одного и того же цикла для разных компиляторов C почти никогда не будет оправдано в большинстве программ, которые вы сделаю. – caf
"Standarc C Library" является спецификацией. Вам нужны источники для реализации спецификации. Ваш компилятор C может предоставить или не предоставить такие источники - тот, который делает это GCC.
Вы также можете взглянуть на OpenBSD source tree. В частности, вы хотите the string subdirectory of libc.
Вот общие функции strXXX C в NetBSD: http://cvsweb.netbsd.org/bsdweb.cgi/src/common/lib/libc/string/
Вот реализация NetBSD strXXX для i386 процессоров http://cvsweb.netbsd.org/bsdweb.cgi/src/common/lib/libc/arch/i386/string/
Если вы используете Visual Studio Professional или команду, вы должны быть в состоянии найти источник здесь :
C: \ Program Files \ Microsoft Visual Studio 9.0 \ VC \ crt \ src
Большинство компиляторов предоставляют исходный код библиотеки - однако исходный код обычно более сложный и запутанный, чем вы могли ожидать.
Хороший ресурс для этого - P.J. Plauger's book, "The Standard C Library", который может быть выполнен довольно дешево, если вы идете на подержанный. Представленный код не всегда прямолинейный, но Plauger объясняет это довольно хорошо (и дает причины, по которым он не всегда может быть прямым и по-прежнему следовать стандарту).
Для ваших целей, это book может быть полезным: Mastering Algorithms with C
Около 10 лет назад я прочитал The Standard C Library by Plauger. Тщательно рекомендую.
Стоит отметить, что исходный код для стандартной библиотеки C необязательно выделяет хорошие методы кодирования. Как стандартная библиотека, он имеет особый статус, где, например, он может полагаться на множество неуказанных или не переносных действий просто потому, что они знают точный компилятор, с которым он используется.
И, конечно же, это говорит только о практике кодирования С.
Это не имеет ничего общего с практикой кодирования на C++, которая очень отличается. Не относитесь к ним как к одному языку. Нет такой вещи, как C/C++. C - это язык со своими правилами кодирования и распространенными идиомами, а C++ - отдельный независимый язык, который также имеет свои собственные практики и идиомы.
Хороший код C редко бывает хорошим кодом на C++. strcpy
и другие функции библиотеки C: обязательно не очень хороший код на C++.
Это была моя первая мысль, когда я увидел этот вопрос. Можно утверждать, что лучшие C-библиотеки имеют специфический процессор. Общий C lib, написанный только на C и минимальный объем функциональности процессора/архитектуры, будет иметь дрянную производительность по сравнению с целевой библиотекой для конкретной системы. Это еще больше беспокоит портативные платформы, где общие оправдания для неэффективного кода не применяются. (т. е. он не будет запускаться на окто-ядерном процессоре с тактовой частотой 3 + ГГц с бесконечной памятью.) – NoMoreZealots
Извините, если это звучало в проповеди, но меня раздражает каждый раз, когда я загружаю свой компьютер, и это занимает больше времени, чем система, которую я имел 20 лет назад , Люди берут аргумент «малоэффективности» до уровня безумия на современных системах. Весь «нетбук» и карманный рынок заставляют меня головокружительно, когда я слышу, как люди скулят по поводу «это недостаточно мощный» для приложений. Теперь вам действительно нужно ДУМАТЬ, разве это не сука! – NoMoreZealots
Я полностью согласен, но иду с другого направления. Я пишу научные приложения для работы на кластерах с 1000 ядрами. В этом масштабе эти небольшие недостатки действительно складываются. За 18 месяцев, когда мы получаем новую систему с удвоенной проблемой, наши проблемы, по крайней мере, удвоились по размеру. Аппаратное обеспечение никогда не собирается догонять то, что мы хотим сделать. – KeithB
В общем, я считаю, что BSD libc намного легче читать, чем GNU. Есть меньше «gcc-isms», ядро намного яснее в намерениях и т. Д. Например, BSD code for malloc вполне читаем по сравнению с glibc
Возможно ли получить исходный код стандартной библиотеки c? – 2009-07-14 19:00:04
Каждый компилятор C будет использовать свой собственный исходный код для стандартной библиотеки C. Аналогично, каждый компилятор C++ будет использовать свой собственный исходный код для стандартных библиотек C и C++ (C++ включает C, поэтому компилятору нужны обе библиотеки). Однако также возможно, что strcpy() непосредственно реализуется компилятором; он может просто исправить правильный код вместо создания вызова функции. – MSalters
Итак, чтобы получить конкретную реализацию библиотеки, нужно выяснить, доступны ли люди, написавшие интересный компилятор, исходный код? –