【问题标题】:Side effects of enabling C++0x support in gcc在 gcc 中启用 C++0x 支持的副作用
【发布时间】:2011-06-12 19:24:22
【问题描述】:

link 之后,我想知道在 GCC 中启用 C++0x 是否有一些副作用。

根据gcc:“GCC 对 C++0x 的支持是实验性的”。

我担心的是,例如编译器会生成一些不同的代码,或者标准库使用了一些在 gcc 中被破坏的 C++0x 功能。

因此,如果我没有明确使用任何 C++0x 功能,它会破坏我现有的代码吗?

【问题讨论】:

  • “实验”部分是在标准最终确定之前开始实施。这意味着随着标准草案的发展,某些部分实际上发生了变化。如果您将损坏定义为“发布编译器时标准草案的外观”,那么现在有些东西可能会损坏。

标签: gcc c++11


【解决方案1】:

C++0x 支持已经并且正在大力开发中。这意味着一件事是错误得到快速修复,另一件事意味着可能存在小错误。我说小,有两个原因:

  1. libstdc++ 没有从头开始重写,所以所有旧元素都和之前的任何c++0x 一样稳定,如果不是更稳定的话,因为几年的错误修复.

  2. 新/旧标准中的一些极端情况尚未解决。这些是您谈论的运行时怪癖吗?没有。C++0x 支持目前正在开发 4 个版本,不用担心。

该标志的大部分影响将在新的语言功能中感受到,移动构造函数和std::thread(在 posix 平台上)等库功能不会影响不使用它们的代码。

底线,实验在日常生产中这个词太严格了。该标准在 GCC 一直致力于支持的三/四年中发生了变化。 c++0x 的旧版本将在新的 GCC 中被破坏,但这是一件好事。 C++0x 就 non-paying-for-a-pdf-world 而言已完成,因此不应添加任何重大更改。事先决定你是否想要新的东西,因为一旦你习惯了使用它,你将无法关闭它。

【讨论】:

    【解决方案2】:

    通常,它不会破坏您的源代码,但您可能会包含(即使没有注意到或不知道它)C++0x 习惯用法,由于启用了这些功能而可以编译,但不会在严格的 C++ 中编译编译器(例如,在 C++0x 中可以使用 >> 作为模板终止符的模板,但在 C++ 中不能,因此如果忘记用空格分隔,则在尝试编译此代码时会遇到问题在 C++ 编译器中)。

    【讨论】:

    • 我更关心运行时的怪癖。
    • @dimba:是的,新功能可能还包括生成代码中的错误,即使对于与 C++0x 无关的其他部分(即使您不启用支持)。在其他情况下,仅当您启用 C++0x 支持时才会出现这些错误。在这一点上,我认为没有人会确切知道。
    【解决方案3】:

    R-Value references/moves 是一个可以对编译器如何进行优化等产生巨大影响的特性。即使您不在自己的代码中使用 move,STD 包含也会自动切换到包含 move ctors/assignment 的新版本。

    在某些情况下,编译器可以为用户定义的类隐式创建移动构造函数/赋值运算符。这些规则在标准化过程中改变了几次(我什至不知道当前的规则是什么)。因此,根据您的编译器的确切版本,它可能会使用一组规则来生成这些隐式函数,而这些规则甚至不在最新版本的标准中。

    大多数其他主要 C++0x 更改对运行时影响不大,它们主要是编译时(constexpr、字符串文字、可变参数模板)或语法帮助程序(foreach、auto、初始化列表)。

    【讨论】:

    • 我应该提到,编译器生成的隐式移动 ctor/assignment 的标准规则是精心设计的,不是破坏现有代码。但这些可能是一些极端情况。 (我找不到关于隐式移动的最终措辞的快速参考......)
    【解决方案4】:

    我最初写你链接的问题是因为(在我看来)here 描述的一个非常大的问题。基本上,编译器无法识别将具有shared_ptr 的函数重载为const 类型。在我看来,这是一个巨大的缺陷。它已从 GCC 4.5 修复到 GCC 4.6,但它作为一个大错误的示例,例如,在 ubuntu 中默认安装的 GCC 中仍然存在。因此,虽然错误很快得到修复,但仍然可能存在错误,您可能会浪费一个周末来寻找这些错误的来源和解决方案。

    根据个人经验,我的建议是避免使用 C++0x,直到从 GCC 对 C++0x 支持的描述中删除“实验性”一词,或者直到您真正需要任何 C++0x在某种程度上,替代实现会显着牺牲良好的设计。

    【讨论】:

    • +1 阅读您的问题时,我认为您很高兴知道我所问问题的答案,而不仅仅是关于线程。
    猜你喜欢
    • 2011-03-16
    • 2011-06-09
    • 1970-01-01
    • 2012-09-24
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 1970-01-01
    • 2011-02-09
    相关资源
    最近更新 更多