为什么像Unreal Engine这样的大项目要写自己的容器类?
Why do big projects like Unreal Engine write their own container classes?
我查看了 Unreal Engine 源代码,发现他们使用自己的容器 classes,例如内部动态数组。但是 C++ STL 提供了(几乎)所有需要的容器 classes。那么他们为什么要花时间再次开发相同的容器呢?开发人员使用 std::vector
之类的容器来编写代码,而不是试图弄清楚如何使用引擎中的 TArray
class 来编写代码,这不是更容易吗?
项目可能不使用 STL 容器的原因有多种:
项目中使用的容器 tailor-made 具有与 STL 版本不同的某些性能特征。
在设计自定义容器时,STL 容器甚至可能不存在,不值得对工作项目进行如此大的更改。
虽然大多数开发人员习惯于 STL 容器,但特定项目的大多数贡献者实际上可能更习惯自定义版本,以及它们应该如何使用,并且重新培训所有这些可能不是也值得付出努力。
对于任何特定项目,上述部分或全部甚至其他原因都可能有助于决定使用自定义容器。
除了@cigien 提到的原因——即使此类应用程序的开发人员不需要 tailor-made 容器,但几个 standard-library 容器的速度仍然很慢, 例如:
- std::vector typically/always 使用堆分配,而不是 small-vector 优化(类似于 short-string optimization 但用于向量)
我查看了 Unreal Engine 源代码,发现他们使用自己的容器 classes,例如内部动态数组。但是 C++ STL 提供了(几乎)所有需要的容器 classes。那么他们为什么要花时间再次开发相同的容器呢?开发人员使用 std::vector
之类的容器来编写代码,而不是试图弄清楚如何使用引擎中的 TArray
class 来编写代码,这不是更容易吗?
项目可能不使用 STL 容器的原因有多种:
项目中使用的容器 tailor-made 具有与 STL 版本不同的某些性能特征。
在设计自定义容器时,STL 容器甚至可能不存在,不值得对工作项目进行如此大的更改。
虽然大多数开发人员习惯于 STL 容器,但特定项目的大多数贡献者实际上可能更习惯自定义版本,以及它们应该如何使用,并且重新培训所有这些可能不是也值得付出努力。
对于任何特定项目,上述部分或全部甚至其他原因都可能有助于决定使用自定义容器。
除了@cigien 提到的原因——即使此类应用程序的开发人员不需要 tailor-made 容器,但几个 standard-library 容器的速度仍然很慢, 例如:
- std::vector typically/always 使用堆分配,而不是 small-vector 优化(类似于 short-string optimization 但用于向量)