Побочные эффекты включения поддержки C ++ 0x в gcc - PullRequest
5 голосов
/ 12 июня 2011

После ссылка мне интересно, есть ли побочные эффекты от включения C ++ 0x в GCC.

Согласно gcc : «Поддержка GCC для C ++ 0x экспериментальная ».

Чего я боюсь, так это того, что, например, компилятор будет генерировать некоторый код по-другому, или стандартная библиотека использует некоторую функцию C ++ 0x, которая не работает в gcc.

Так что, если я не буду явно использовать какие-либо функции C ++ 0x, может ли это сломать мой существующий код?

Ответы [ 4 ]

3 голосов
/ 12 июня 2011

Поддержка C ++ 0x была и находится в стадии интенсивного развития. Это означает, что ошибки могут быть быстро исправлены, а это означает, что могут быть небольшие ошибки. Я говорю маленький, по двум причинам:

  1. libstdc++ не был переписан с нуля, поэтому все старые элементы так же стабильны, как и до того, как что-либо из этого c++0x было доступно, если не более стабильно, из-за нескольких лет исправлений ошибок .

  2. В новом / старом стандарте есть угловые случаи, которые еще не проработаны. Вы говорите об этих причудах времени выполнения? Нет. C++0x Поддержка была в разработке для 4 выпусков, не волнуйтесь.

Большая часть воздействия этого флага будет ощущаться в новых языковых функциях, библиотечные функции, такие как конструкторы перемещения и std::thread (на платформах posix) не влияют на код, не использующий их.

Итог, экспериментальный - слишком строгое слово в ежедневном производстве. Стандарт изменился за три / четыре года, GCC работает над поддержкой. Старые версии c++0x будут сломаны в новом GCC, но это хорошо. C++0x завершено в том, что касается мира «не платит за pdf», поэтому не нужно добавлять никаких критических изменений. Решите, хотите ли вы новый материал или нет заранее, потому что вы не сможете просто отключить его, как только привыкнете.

1 голос
/ 13 июня 2011

Я изначально написал вопрос, на который вы ссылаетесь, из-за (на мой взгляд) очень большой проблемы, описанной здесь . По сути, перегрузка функции с shared_ptr на тип const не была распознана компилятором. Это огромный недостаток, на мой взгляд. Он был исправлен с GCC 4.5 до GCC 4.6, но он служит примером большой ошибки, которая все еще существует при установке GCC по умолчанию в Ubuntu, например. Таким образом, хотя ошибки исправляются быстро, они все же могут быть, и вы можете потратить выходные на поиск источника и решения этих ошибок.

Моя рекомендация, основанная на этом личном опыте, избегать C ++ 0x до тех пор, пока слово «экспериментальный» не будет удалено из описания поддержки GCC C ++ 0x в GCC или до тех пор, пока вам не понадобится какой-либо из C ++ 0x до такой степени, что альтернативная реализация значительно жертвовала бы хорошим дизайном.

1 голос
/ 12 июня 2011

Ссылки / перемещения R-значения - это функция, которая может оказать огромное влияние на то, как компилятор выполняет оптимизацию и тому подобное.Даже если вы не используете move в своем собственном коде, STD автоматически переключится на новые версии, которые включают ctors / assignment Move.

Существуют некоторые обстоятельства, которые позволяют компилятору неявно создавать конструкторы перемещения / операторы присваивания для пользовательских классов.Эти правила менялись несколько раз в процессе стандартизации (я даже не знаю, каковы текущие правила).Поэтому, в зависимости от конкретной версии вашего компилятора, он может использовать набор правил для генерации этих неявных функций, которых нет даже в последней версии стандарта.

Большинство других основных C ++Изменения 0x не оказывают большого влияния во время выполнения, они в основном являются временем компиляции (constexpr, строковые литералы, шаблоны varadic) или помощниками синтаксиса (foreach, auto, списки инициализатора).

1 голос
/ 12 июня 2011

Обычно это не нарушает ваш исходный код, но вы можете включить (даже не замечая этого или не зная об этом) идиомы C ++ 0x, которые будут компилироваться из-за включенных этих функций, но не будут компилироваться в строгом C ++ компилятор (например, в C ++ 0x вы можете использовать >> в качестве шаблона терминатора шаблона, но не в C ++, поэтому, если вы забудете разделить его пробелом, у вас будут проблемы при попытке скомпилировать этот код в компиляторе C ++).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...