STL中是否有“魔术”?
让我开始解释我的意思是“魔术”。 我将使用来自Java的两个示例:
- 每个类都inheritance(直接或间接)
Object
类。 - 运算符重载不受Java支持,但
+
运算符是为String
对象定义的。
这意味着在纯Java(*)中不可能实现Object
和String
类。 现在这就是我所说的“魔术”:为了实现这些类,你需要编译器的一些特殊的支持。
我一直很喜欢C ++,就我所知,在STL中没有这样的“魔术”,也就是说可以在纯C ++中实现STL。
现在我的问题是:这是真的吗? 还是有部分STL无法在纯C ++中实现,需要一些“魔术”/特殊的编译器支持?
(*)“纯”的意思是不使用任何类库。
换句话说,编译器已经做了什么来允许STL需要工作的“特殊情况”?
没有。
这一切都是作为纯粹的C ++代码实现的,使用模板的魔力。
编译器已经做了一些改进STL的工作(我正在考虑各种优化),否则,如果你真的想,你可以编写整个STL。 有些人做了 – STLPort是一个没有任何编译器制造商支持的实现。
像gbjbaanb正确的说过,STL可以用纯C ++实现,而不依赖于任何一种编译器的“魔术”。
但是,如果你为你的编译器挖掘STL源代码,你可能会看到代码不是标准的,或者你不应该编写自己的代码。
STL完全可以在标准C ++中实现,但这并不意味着编译器编写者不允许偶尔使用编译器特定的扩展来改进它。 例如,他们可能会插入非标准的代码来确保更好的错误信息,或者在编译器中解决某些缺陷,或者可以通过使用特定编译器的额外function来启用特殊的优化。
他们也一贯使用你不允许使用的名字。 例如,模板参数通常被命名为类似_Type
types,由于它以下划线开始,后跟大写字母,所以被保留用于实现 。 标准库允许使用它们,但你和我不是。 所以如果你要编写你自己的STL实现,你将不得不做一些小的改变,但这不是因为任何魔术,只是一种避免标准库和用户代码之间的名称冲突的方法。
正如其他人所说,STL可以在纯粹的标准C ++ 98中实现。 没有说过的是,STL的发展与C ++模板机制的发展并行,并且在很大程度上推动了某些特征的包含。 我相信参数依赖查找(ADL,又名Koenig Lookup) ,模板模板参数和默认模板参数都来自C ++,为Stepanov的STL开发提供服务。
所以,在STL中,他们把魔法变成了语言本身。 不错,标准委员会认识到,如果这些function对于成为标准库的有用,它们可能对我们其他人有用!
如果通过STL,你的意思只是C ++标准库的模板部分,那么完全可以在没有任何“魔力”的情况下实现它。 是否每个给定的实现实际上使用任何“魔术”是一个不同的问题(有部分STL“魔术”将帮助,但不是绝对需要)。
现在,如果你正在谈论整个C ++标准库,那么它确实有一些“魔力”。 经典的例子是库提供的::operator new
和::operator delete
实现。 我们经常把它们称为“可以超负荷”的日常用语,而在forms上它们是可以replace的 。 C ++语言不为用户提供这样的function。 用户不能写可replace的function。
另一个例子是macros的offsetof
(inheritance自C标准库)。 虽然通常以“纯粹的C”来实施,但从迂腐的angular度来看,stream行的实现实际上是非法的(导致未定义的行为)。 我还没有看到任何正式的offsetof
合法实现,所以我不确定它们是否可能。
另一个例子是(再次从Cinheritance)用于处理可变参数的macros。 他们显然不能用纯C或C ++实现。
我很确定一些type_traits
需要编译器魔术,例如has_trivial_constructor
, has_virtual_destructor
或is_pod
。
std::initializer_list
需要编译器支持,不能被重新实现为另一个类(据我所知),虽然我不知道它是否因为它在c ++ 0x。
C ++ 0x将标准化一些事实上的 “魔术”types特征。
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2984.htm
“C ++ 0x的其他types特征”
这包含了一些评论,如“XXXX被认为需要编译器支持”。
也可以看看
http://gcc.gnu.org/onlinedocs/gcc-4.3.2/gcc/Type-Traits.html#Type-Traits
http://msdn.microsoft.com/en-us/library/ms177194(v=vs.80).aspx
正如“gbjbaanb”所说的,STL的实施并没有什么魔力。 它是用纯C ++编写的。 你可以自己实现它,但已经成为一个图书馆,使您的生活更简单。
STL是标准的(标准模板库)。 该标准规定了STL实现的要求。 从使用的angular度来看,没有“魔力”,没有特别的依赖关系,你必须照顾。 它可以在任何主要的C ++编译器上,在这些编译器所支持的所有平台上使用。