在STL中有“魔术”吗?

让我首先解释“魔术”的含义。 我将使用Java中的两个示例:

  1. 每个类都(直接或间接)继承Object类。
  2. Java不支持运算符重载,但为String对象定义了Object运算符。

这意味着不可能在pure(*)Java中实现ObjectString类的实现。 现在,这就是我所说的“魔术”的含义:要实现这些类,您将需要编译器的一些特殊支持。

就我所知,我一直喜欢C ++的地方是,据我所知,STL中没有发生这种“魔术”现象,即可以在纯C ++中实现STL。

现在我的问题是:这是真的吗? 还是STL的某些部分无法在纯C ++中实现,并且需要一些“魔术” /特殊编译器支持?


(*)“纯”是指不使用任何类库。

Job asked 2020-02-23T00:14:50Z
9个解决方案
52 votes

换句话说,是否对编译器做了任何处理以允许STL工作所需的“特殊情况”?

没有。

使用模板的魔力,所有这些都以“纯” C ++代码实现。

已经对编译器进行了一些改进STL的工作(我正在考虑各种优化),否则,不可以,如果您确实需要,可以编写整个STL。 有人做到了-STLPort是一个没有任何编译器制造商支持的实现。

gbjbaanb answered 2020-02-23T00:15:18Z
40 votes

就像gbjbaanb正确地说的那样,STL可以用纯C ++实现,而无需依赖任何类型的编译器“魔术”。

但是,如果您为编译器挖掘STL源代码,则可能会看到不是标准的代码,或者是不应该自己编写的代码。

STL可以完全用标准C ++实现,但这并不意味着不允许编译器编写者偶尔使用编译器特定的扩展对其进行改进。 例如,他们可能插入非标准代码以确保更好的错误消息,或者解决其编译器中的某些缺陷,或者可能通过使用特定编译器的其他功能来进行特殊优化。

它们还始终使用不允许使用的名称。 例如,模板参数通常被命名为_Type之类的名称,由于其以下划线开头,后跟一个大写字母,因此保留给实现。 允许标准库使用它们,但您和我则不允许。 因此,如果要编写自己的STL实现,则必须进行一些较小的更改,但这并不是因为有任何魔术效果,而只是一种避免标准库和用户代码之间发生名称冲突的方法。

jalf answered 2020-02-23T00:15:53Z
15 votes

正如其他人所说,STL可在纯标准C ++ 98中实现。 尚未说的是,STL的开发与C ++模板机制的开发同时进行,并在很大程度上推动了某些功能的包含。 我相信Argument Dependent Lookup(ADL,又名Koenig Lookup),模板模板参数和默认模板参数都已加入C ++以服务于Stepanov的STL开发。

因此,借助STL,他们将魔术融入了语言本身。 很高兴标准委员会认识到,如果这些功能对于将成为标准库的东西有用,那么它们对我们其他人也可能有用!

Drew Hall answered 2020-02-23T00:16:19Z
14 votes

如果用STL表示仅是C ++标准库的模板部分,那么完全有可能实现它而无需任何“魔术”。 每个给定的实现是否实际使用任何“魔术”是一个不同的问题(在STL的某些部分,“魔术”会有所帮助,但并非绝对必要)。

现在,如果您要讨论整个C ++标准库,那么它的确确实有些“神奇”。 经典示例将是库提供的offsetofoffsetof实现。 我们通常将它们称为日常语言中的“可重载”,而在形式上它们是可替换的。 C ++语言不向用户提供此类功能。 用户无法编写可替换功能。

另一个示例是offsetof宏(从C标准库继承)。 尽管通常是在“纯C”中实现,但从学究的角度来看,流行的实现实际上是非法的(导致未定义的行为)。 我还没有看到offsetof的任何正式合法实现,因此我不确定它们是否可能。

另一个示例是(同样,继承自C)使用可变参数的宏。 它们显然不能用纯C或C ++实现。

AnT answered 2020-02-23T00:16:54Z
10 votes

我很确定某些type_traits需要编译器魔术,例如has_trivial_constructorhas_virtual_destructoris_pod

fredoverflow answered 2020-02-23T00:17:14Z
6 votes

std::initializer_list需要编译器支持,并且不能重新实现为另一个类(据我所知),尽管我不确定它是否有价值,因为它在c ++ 0x中。

answered 2020-02-23T00:17:34Z
5 votes

C ++ 0x将标准化一些事实上的“魔术”类型特征。

[HTTP://呜呜呜.open-实体店.org/脚踏车1/生成22/我国21/docs/papers/2009/你2984.htm]

“ C ++ 0x的其他类型特征”

其中包含一些注释,例如“ XXXX被认为需要编译器支持”。

也可以看看

[HTTP://GCC.弓弩.org/online doc S/GCC-4.3.2/GCC/type-traits.HTML#type-traits]

[HTTP://MSDN.Microsoft.com/恩-US/library/马上177194(V=vs.80).aspx]

spraff answered 2020-02-23T00:18:21Z
2 votes

正如“ gbjbaanb”正确说的那样,STL的实现没有任何魔术。 它是用纯C ++编写的。 您可以自己实现它,但现在已经可以作为库轻松使用,从而使您的生活更简单。

Swapnil answered 2020-02-23T00:18:41Z
-2 votes

STL是标准的(标准模板库)。 该标准规定了STL实现的要求。 从使用的角度来看,没有“魔术”,也没有特别的依赖项。 它可以在任何主要的C ++编译器以及这些编译器支持的所有平台上使用。

Cătălin Pitiș answered 2020-02-23T00:19:02Z
translate from https://stackoverflow.com:/questions/3573768/is-there-magic-in-the-stl