我应该将标准C ++容器和东西用于游戏和其他实时活动吗?

时间:2015-02-06 05:10:57

标签: c++ optimization stl game-engine

我是使用VS 2012和VS 2010开发AAA游戏的C ++开发人员。我已经读过没有使用STL和VS附带的标准头文件中提供的其他东西。我根据游戏编程阅读了网站上的大部分内容,其中一些真的来自业内众所周知的人。我见过他们甚至不使用矢量,列表,地图等的情况,甚至没有使用效用函数和算法。在这种情况下,他们会编写那些容器和自己的东西,它们具有几乎相同的接口,并且在这些巨大的代码上花费了大量的调试和实现时间。

我有两个问题:

1:不是为平台优化的VS附带的C ++实现以获得更好的性能吗?是不是它使用了一些内部函数,客户端的人们不知道并提供自己的实现,在插入,删除,查找,交换,复制等基本容器操作中确实会更慢?让我们假设我们提供自己的自定义分配器,以便更快地将内存管理到我们使用的每个容器。此外,他们负责碎片,对齐和东西。为什么要开发具有几乎相同接口的自定义容器,为什么不花时间编写分配器和其他可能实际有用的东西呢?

2:有些时候,我们通过巨大的代码库中的标准头文件包含了很多不必要的东西。不必要,因为我们只需要一些或两个来自如此巨大的标题,包括其他巨大的标题等等。现在,我知道模板除非被使用,否则不会被实例化,对于它们内部的成员函数也是如此,等等等等。因为,这些是预编译的头文件,所以可以安全地假设没有编译时间用于那些不必要的东西。我的问题是,这些包含对代码大小(可执行文件)有任何隐藏的影响,随着代码库的巨大增长而增长吗?在我看来不应该,但我想知道我以防万一。

由于

2 个答案:

答案 0 :(得分:1)

  1. STL针对通用计算的性能进行了优化。许多应用程序具有特定的特性,可以利用这些特性来提高性能(尽管可能仅略微),超出了完全通用解决方案所提供的性能。与此同时,很多人都会编写自己的容器并最终导致性能下降,因为他们不能很好地理解问题,或者由于测试有限而导致从未发现的错误(相对于接近无限接近的大多数STL实现)测试)。

  2. 不,通常不会因为包含大量头文件而对运行时性能造成任何损害。

  3. 除了您的具体问题,如果您正在开发AAA游戏,您应该向同行寻求有关这些问题的指导。任何AAA工作室都会有至少一两个人,他们有资格以更高的细节为您提供建议。

    最后,虽然STL和C ++标准库的某些部分对某些常见用例(例如std :: list,iostreams)的性能不是很理想,但其他部分通常都相当不错(std :: vector,std :: copy) )。没有适用于整个语言的规则......如果有的话,我们可能会使用其他语言!

答案 1 :(得分:0)

这取决于工作室。您可以根据问题的拓扑结构编写分配器以提高内存性能,您可以使用完全相同的原因创建特征。

STL是一个了不起的工具,它的使用问题是很多程序员不知道如何使用,并最终使用他们自己的类来完成基本的事情。

例如,我的实际公司有一堆用c ++编写的库来避免STL,经过12年多的时间,我发现了字符串实现中的基本错误,并且一位同事在地图中找到了另一个。

STL可以快速燃烧你总是知道如何。你应该看一下intel TBB +自定义分配器+ stl性能。仔细看看这个问题Compelling examples of custom C++ allocators?