【问题标题】:Why do big projects like Unreal Engine write their own container classes?为什么像虚幻引擎这样的大项目要编写自己的容器类?
【发布时间】:2021-01-17 07:59:31
【问题描述】:

我浏览了虚幻引擎源代码,发现它们使用自己的容器类,例如内部动态数组。但是 C++ STL 提供了(几乎)所有必要的容器类。那么他们为什么要花时间再次开发相同的容器呢?开发人员使用std::vector 之类的容器编写代码,而不是尝试使用引擎中的TArray 类来弄清楚如何做事情,不是更容易吗?

【问题讨论】:

  • 历史,也许? Development on the engine began in 1995,而the first public implementation of the STL had only been released in 1994。 Sweeney 当时可能认为它不够成熟,即使开发人员后来改变了主意,也可能没有充分的理由去麻烦转换所有现有代码。
  • 虚幻使用它自己的反射和GC。
  • @NateEldredge 在相当长的一段时间内,STL 容器的性能确实很差。 John Carmack 在接受采访时表示,在 Doom 3 开发期间(~2002-2004),STL 基本上甚至不是最前沿的游戏开发的选择。他们还为这些东西推出了自己的库。
  • 作为从事我自己的大型项目的人,我可以根据我的经验说,有时,您会发现自己需要为您的项目量身定制的功能,而 C++ STL 不提供这些功能。我的项目中的一个这样的功能是能够将元素表示为指向项目基类类型对象的指针(如果可能)(std::vector 无法提供)。此外,我发现自己只想在这个项目中尽可能少地依赖标准库。
  • @TrecApps 不完全是题外话,请问为什么?对于一个新项目,以下答案中给出的原因并不真正适用。我建议尽可能使用 STL,并且仅在绝对必要时编写自己的东西。

标签: c++ game-engine c++-standard-library


【解决方案1】:

项目可能不使用 STL 容器的原因有多种:

  1. 项目中使用的容器是量身定制的,具有与 STL 版本不同的某些性能特征。

  2. 在设计自定义容器时,甚至可能不存在 STL 容器,因此对工作项目进行如此大的更改是不值得的。

  3. 虽然大多数开发人员习惯于 STL 容器,但特定项目的大多数贡献者实际上可能更习惯于自定义版本,以及应该如何使用它们,并且重新培训所有这些可能也不值得。

对于任何特定项目,上述部分或全部,甚至其他原因可能会促成使用自定义容器的决定。

【讨论】:

  • 让我补充一点,STL 容器的性能特征会因编译器和平台而异,而编写自己的库将导致更一致的跨平台行为。
  • 此外,标准要求 STL 容器具有一定程度的线程安全性(参见 this answer),而自定义容器的用户可能不需要。
【解决方案2】:

除了@cigien 提到的原因 - 即使此类应用程序的开发人员不需要量身定制的容器,但几个标准库容器仍然很慢,例如:

【讨论】:

  • 我曾经看到 std::basic_string 用作 SSO 的向量
猜你喜欢
  • 2018-02-18
  • 2020-05-25
  • 2018-05-28
  • 2020-11-22
  • 1970-01-01
  • 1970-01-01
  • 2022-11-25
  • 2016-03-07
  • 1970-01-01
相关资源
最近更新 更多