|
Программирование >> Обобщенные обратные вызовы
Зарезервированные комментарии Большинство ключевых слов выполняют какие-то действия. И это правильно - иначе зачем они нужны? Однако некоторые ключевые слова и близко не делают того, на что вы могли бы надеяться. Некоторые из них не имеют никакого семантического влияния на программу вообще, т.е. семантически они эквивалентны пробельным символам, эдаким приукрашенным комментариям. Я имею в виду три ключевых слова - auto, register и, во многих отношениях, inline (см. задачу 25). (Тем, кто удивлен, почему здесь не указано ключевое слово export, могу посоветовать обратиться к задачам 9 и 10.) auto Рассмотрим сначала ключевое слово auto. 2. Как добавление ключевого слова auto изменяет семантику программы на С++? Если говорить коротко: никак, auto - совершенно излишний спецификатор класса памяти. Он появляется только в описаниях локальных объектов (объявленных в блоке кода) и указывает, что эти объекты автоматически уничтожаются при завершении их функции или блока; однако во всех случаях, где допустимо применение auto, предполагается именно такое поведение, если это ключевое слово не указано, что и делает спецификатор auto излишним. То есть, auto означает то же, что и любой пробельный символ. Сейчас искогорые подкованные читатели стандарта С++ могут громко возразить: Это не совсем то, что говорит стандарт! В нем всего лишь сказано, что спецификатор auto почти всегда излишен! И это так: ...спецификатор auto почти всегда излишен и редко используется; одно из предназначений auto - для явного отличия объявления от выражения. - [С++03] §7.1.1 Да, это сказано в стандарте, но это не так (и я уже подал соответствующее сообщение в комитет). Почему? Правило С+ + , которое применяется к таким неоднозначностям, гласит, что все. что может быть объявлением, должно быть объявлением - и добавление auto ничего не меняет. Например: пример 28-2: auto не разрешает неоднозначности. i nt i; i nt j; int mainC) { int(i); объявление i; не ссылка на ::i auto int(j); объявление j. a не ссылка на ::j int f(); объявление функции, a не объект типа int, инициализированный по умолчанию auto int f(); такое же объявление функции, хотя и приведет к ошибке на строгом } компиляторе Более подробно неоднозначность объявлений в С++ рассматривается в задаче 29 (см. также раздел 39 в [MeyersOl]). В итоге auto не может использоваться для разрешения описанных неоднозначностей. > Рекомендация Никогда не используйте auto. Это ключевое слово имеет тот же смысл, что и пробельный символ. Кстати, возможно, в будущем auto будет играть гораздо более важную роль. При работе над очередным стандартом С++ комитет рассматривает вариант применения auto в качестве ключевого слова для автоматического выведения типа, так что в будущем, быть может, мы будем заменять объявления наподобие vector<someNamepace: .SomeType>: .const iterator i = v.beginO; простым и выразительным auto i = V.beginC); Возможное будущее расширение С++ register Но достаточно об auto. Обратимся к register. 3. Как добавление ключевого слова register изменяет семантику программы на С++? Говоря коротко: для большинства современных компиляторов - никак. Чтобы понять, почему - посмотрим, что говорит стандарт сразу после процитированного примечания об auto... Начинается он так: Спецификатор register имеет ту же семантику, что и спецификатор auto... Гм... Как мы только что выяснили, .это означает не имеет семантики . Грустное начало... Но прочтем дальше: ...и, кроме того, подсказывает компилятору, что объявленный таким образом объект будет активно использоваться. [Примечание: подсказка может быть проигнорирована и в большинстве реализаций она будет проигнорирована, если запрашивается адрес объекта.] - [C++03J §7.1.1 Идея спецификатора register в том, что если некоторые переменные активно используются, то имеет смысл по возможности разместить их в регистрах процессора, что позволит работать с ними гораздо быстрее, чем если они будут выбираться из (относительно) медленного кэша или, что еше хуже, из основной памяти. Все это было бы хорошо, но сегодня идея о том, что программист должен сам указывать компилятору, какую переменную следует разместить в регистре, а какую нет, - выглядит анахронизмом. Дело в том, что практически нереально, чтобы даже программист высочайшего уровня смог выбрать оптимальное распределение переменных по регистрам, которое обеспечит наивысшую производительность кода. Даже если программист точно знает, на каком процессоре будет выполняться его код (что бывает очень редко), и знает этот процессор на уровне разработчиков кодогенератора для этого процессора (что тоже маловероятно), он никогда не сможет распределить объекты по регистрам так же хорошо, как это сделал бы хороший компилятор, хотя бы потому, что программист ничего не знает о других преобразованиях, например, о встраивании, разворачивании циклов, устранении неиспользуемого кода и других - которые были выполнены компилятором. Вы не только не сможете выполнить работу так же хорошо, как ваш компилятор, но и не должны стремиться к этому - для этой работы имеется специальный инструментарий. > Рекомендация Никогда не используйте ключевое слово register, кроме тех случаев, когда вы досконально знаете компилятор и особенности применения в нем этого спецификатора. Для большинства компиляторов это ключевое слово означает то же, что и пробельный символ. Резюме Итак, вы уже знаете, почему С++ резервирует ключевые слова, и выяснили, что два из них - auto и regi ster - не привносят никаких семантических изменений в программу на С+ + . Не используйте их - по сути это всего лишь разновидность пробельных символов, а внести в исходный текст пробельный символ можно с гораздо меньшими усилиями. Никогда не пишите в программе auto. Это ключевое слово не имеет никакого значения. Никогда не пишите в программе register (если только у вас нет абсолютной уверенности в том, что это слово имеет значение при использовании вашего компилятора в конкретном исходном тексте). Для большинства компиляторов этот спецификатор ничем не отличается от пробельного символа.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |