【问题标题】:C++11 library features dependent on compiler specific proxysC++11 库功能取决于编译器特定的代理
【发布时间】:2011-11-14 23:10:41
【问题描述】:

通过反复试验引起了我的注意,有些 C++11 功能依赖于某种编译器魔法 (TM)。我一直在搞乱实现我自己的标准符合标准的stdlib。我知道有现成的 stdlib 实现,但这个更像是我自己的小型应用程序的个人版本。

昨晚我根据规范实现了std::initializer_list,但我无法让它工作,我搜索了高和低的答案,结果发现这是不可能的,并且需要修改编译器本身。好吧,我决定看看它当前的libstdc++ 实现,果然我的实现在设计上完全相同,只是边缘略有不同,我浪费了无意义的时间来弄清楚为什么实现不起作用,什么时候它的设计与libstdc++ 中的设计完全相同。直到六个小时后,我才意识到它必须在命名空间 std 中。结果证明,merley 是编译器的代理,它使initializer_list 成为可能,编译器本身在namespace std 中搜索initializer_list 类。

我的问题是我应该知道是否还有其他库功能需要某种特殊的编译器魔法才能工作,是否需要更多隐藏的代理连接,或者为任何新的 C++11 库功能隐藏编译器本质? 我想提前知道这些,这样我就可以为实现其他依赖于编译器魔法的功能做好准备,而不是浪费一整天的时间通过反复试验来弄清楚;这会变得乏味而且相当烦人。

谢谢。

【问题讨论】:

    标签: c++ compiler-construction c++11 initializer-list c++-standard-library


    【解决方案1】:

    <exception> 中的函数大多是编译器的钩子。

    如果没有编译器的帮助,几个<type_traits> 属性查询是不可能或很难实现的。即使那些仅仅是困难的也可能由于“作弊”而在编译器的本机 stdlib 成功的情况下出现故障。当然,它们也会编译得更快。

    虽然可以编写 <iostream> 以使 cincout 在首次使用时自动初始化,但大多数编译器选择欺骗并链接它们,以便它们在静态初始化中首先出现。

    <typeinfo> 当然必须与编译器期望的完全匹配。

    可能还有更多我不知道或想不到的事情。

    除了标准库“作弊”和依赖编译器外,编译器还可能依赖标准库中存在的非标准函数。因此,即使您实现了所有标准功能,您也可能需要复制粘贴例程来遍历异常表、处理虚拟析构函数中的层次结构等。

    【讨论】:

    • 在尝试弄清楚 std::function 在头文件中的工作原理之后,我怀疑它也很神奇。
    【解决方案2】:

    编译器所需的所有“魔法”类型都列在 C++ 规范中称为“语言支持库”的特殊部分中。显然,如果您正在实现 C++ 标准库,您应该手边有一份标准副本。初始化器列表以及 type_info<cstdint>、全局运算符 new/delete、<exception> 等都在该部分中。

    不要尝试实现这些;使用编译器给你的。

    【讨论】:

    • <cstdint> 可以通过自省来完成,如果不是最高质量的话,全局可替换的 new/delete 应该可以使用私有命名空间和 using 指令(我没有尝试过) .但是,是的,该条款的大部分内容都适用。 — 哎呀,这样的new 不能命名为::operator new,所以你是对的。
    猜你喜欢
    • 1970-01-01
    • 2013-07-20
    • 1970-01-01
    • 2012-04-16
    • 2017-03-09
    • 1970-01-01
    • 2014-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多