|
Программирование >> Оптимизация возвращаемого значения
char * strdup{const char *ps); Вернуть копию строки, / / на которую указывает ps. Чтобы избежать утечек, память, выделенная внутри функции strdup, должна освобождаться в функции, которая вызывала strdup. Но как это сделать? При помощи оператора delete? Вызвав функцию free? Если вызывается функция strdup из библиотеки С, придется выбрать второй вариант. Если функция была написана для библиотеки С++, вероятно, первый. Следовательно, то, что нужно сделать для функции s t гdup, меняется не только от системы к системе, но и от компилятора к компилятору. Чтобы обеспечить переносимость, старайтесь избегать вызова функций, которые не входят в стандартную библиотеку (см. правило 35) или не доступны в устойчивой форме на большинстве компьютерных платформ. Совместимость структур данных Теперь пора поговорить о передаче данных между программами С и С++. Нельзя надеяться, что функции С будут понимать свойства функций С++, поэтому уровень общения между двумя языками должен быть ограничен понятиями, которые можно выразить на С. Не существует переносимого способа передавать процедурам, написанным на С, объекты или указатели на функции - члены класса. Но язык С понимает обычные указатели, поэтому если ваши компиляторы С и С++ дают совместимый выход, то функции в двух языках могут безопасно обмениваться указателями на объекты и указателями на статические функции или функции, не являющиеся членами класса. Как и следовало ожидать, структуры и переменные встроенных типов (например, int, char и т.д.) также могут свободно пересекать границу C/C++. Поскольку правила, обусловливающие формат struct в С++, согласуются с соответствующими правилами С, то можно с уверенностью предположить, что определение структуры, которое компилируется в обоих языках, будет расположено обоими компиляторами одинаковым образом. Такие структуры можно безопасно передавать из С в С++ и обратно. Если добавить невиртуальные функции в версию структуры, написанную на С++, то формат структуры в памяти не должен измениться, поэтому объекты структуры (или класса), содержащие только невиртуальные функции, будут совместимы со своими собратьями в С, в определении структуры которых отсутствует только объявление функций - членов класса. Но все это перестанет работать при введении виртуальных функций, поскольку добавление к классу виртуальных функций приводит к тому, что формат объектов этого типа в памяти становится другим (см. правило 24). Наследование структуры от другой структуры (или класса) также изменяет ее формат, поэтому структуры с базовыми структурами (или классами) являются не лучшей кандидатурой для обмена с функциями С. С точки зрения структуры данных все вышесказанное сводится к следующему: можно безопасно передавать структуры данных из С++ в С и обратно, если определение этих структур компилируется и в С, и в С++. Добавление невиртуальных функций-членов к С++ версии структуры, которая до этого была совместимой с С, вероятнее всего, не повлияет на совместимость, в отличие от почти всех других изменений. Резюме Если вы хотите сочетать С и С++ в одной программе, не забывайте о следующих простых принципах: □ убедитесь, что компиляторы С и С++ создают совместимые объектные файлы; □ объявляйте функции, которые будут использоваться в обоих языках, с директивой extern С ; □ если возможно, напишите функцию main на С++; □ всегда используйте delete для памяти, выделенной при помощи new; всегда используйте free для памяти, выделенной при помощи malloc; □ ограничьтесь передачей только структур данных, которые компилируются в С; версии структур в С++ могут содержать также невиртуальные функции-члены. Правило 35. Ознакомьтесь со стандартом языка с момента своей публикации в 1990 году книга The Annotated С++ Reference Manual (Справочное руководство по С++ с комментариями) являлась исчерпывающим справочником для профессиональных программистов, которым нужно было знать, что входит в язык С++, а что нет. За время, прошедшее после выхода ARM (часто употребляемое сокращение для справочника), комитет по стандартизации ISO/ANSI внес в язык довольно много изменений, как незначительных, так и крупных (в основном добавления). Поэтому сейчас справочник ARM уже не может считаться исчерпывающим. Внесенные в С++ изменения помогают писать хорошие программы. И тем, кто хочет быть настоящим профессионалом, необходимо знать различия текущего стандарта С++ и его версии, описанной в ARM. Производители программного обеспечения руководствуются стандартом ISO/ANSI для С++ при разработке компиляторов, авторы из5Д1ают его при написании книг, а программисты ищут в нем ответы на практические вопросы. Наиболее важные изменения в языке С++, введенные после выхода ARM, таковы: □ добавлены новые свойства: RTTI, пространства имен, тип bool, ключевые слова mutable и explicit, возможность перегружать операторы для перечислимых типов и инициализировать константные целые статические члены класса в определении класса; □ расширено применение шаблонов: разрешено создание шаблонов функций -членов класса, определен стандартный синтаксис, при помощи которого можно потребовать создания экземпляров шаблонов, в шаблонах функций теперь разрешены аргументы без типа, и шаблоны классов сами могут использоваться в качестве аргументов шаблонов; □ усовершенствована обработка исключений: спецификации исключений более строго проверяются во время компиляции, и функция unexpected может порождать объект bad exception; □ изменены процедуры выделения памяти: добавлены функции operator new [ ] и operator delete [ ], операторы new/new [ ] теперь генерируют исключение, если память не может быть вьщелена, и введены альтернативные версии операторов new/new [ ], возвращающие О в случае неудачной попытки выделения памяти; □ добавлены новые формы приведения типов: static cast, dynamic cast, const cast и reinterpret cast; □ усовершенствованы правила тыка: тип значения, возвращаемого переопределенными виртуальными функциями, не должен больше в точности совпадать с типом переопределяемой функции, а время жизни временных объектов определено точно. Почти все эти изменения описаны в книге The Design and Evolution of С++ (Разработка и эволюция С++). Современные учебники по С++ (написанные после 1994 года) также должны включать их. (Если вам попадется книга, в которой они не описаны, откажитесь от ее покупки). Книга Наиболее эффективное использование С++ (которую вы держите в руках) содержит примеры практического применения большинства из этих новых свойств. Если вас интересует какое-либо из них, поищите соответствующую запись в указателе. Но изменения в языке С++ бледнеют по сравнению с тем, что произошло со стандартной библиотекой. Кроме того, эволюция стандартной библиотеки не была отражена так же широко, как эволюция языка. Например, книга The Design and Evolution of С++ почти не упоминает стандартную библиотеку. Большинство книг, описывающих библиотеку, безнадежно устарели, так как она была значительно изменена в 1994 году. Возможности стандартной библиотеки условно делятся на следующие основные категории: □ поддержка стандартной библиотеки С. С++ не забывает про свои корни. Небольшая доработка привела С++ версию библиотеки С в соответствие с более строгой проверкой типов в языке С++, но практически все, что вы знали и любили (или ненавидели) в библиотеках С, осталось и в С++; □ поддержка строк. Как было заявлено председателю рабочей группы стандартной библиотеки С++ Майку Вайлоту (Mike Vilot), если не появится стандартный тип string, на улицах прольется кровь! . (Некоторые люди бывают столь эмоциональны.) Успокойтесь и отложите топоры и дубинки - стандартная библиотека С++ содержит строки; □ поддержка локализации. В разных странах используются разные наборы символов и соглашения при выводе даты и времени, сортировке строк, выводе значений денежных знаков и т.д. Поддержка локализации в стандартной библиотеке облегчает разработку программ, приспособленных к тради циям той или иной культуры;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |