C++-整个程序持续时间内的单个本地类实例

C++ - Single local class instance for entire program duration

本文关键字:单个本 实例 程序 持续时间 C++-      更新时间:2023-10-16

我正在C++中开发一个lil'游戏引擎,并决定全部OOPily(大量使用类)它(理论上)是跨平台的,所以我有一个"引擎"类,它的一个实例是由"操作系统模块"创建的,即WinMain for Windows(我首先开发它的平台)

我有三个主要问题:

  1. 创建一个在整个应用程序中只实例化一次的类是否被认为是一种糟糕的做法也许是因为使用一个类而不是一堆函数会对性能造成影响或增加开销?

  2. 我一直计划让WinMain创建Engine实例作为局部变量。Engine类将相当大,包含用于渲染、脚本解析、文件系统等的类。基本上,除了操作系统特定的代码外,整个游戏引擎都将以某种形式包含在Engine类中(可能是另一个类的实例)。在WinMain函数中创建我的大型Engine类的本地实例是个坏主意吗?创建一个本地实例是一个坏主意吗?当程序启动时创建类,当程序结束时结束?也许会更好

  3. 我的计划是将引擎划分为"模块",每个模块由一个类表示。Engine类将包含几乎所有其他模块的实例,如上文所述,渲染、文件系统交互等。从某些角度(性能、设计、可读性?)来看,将类用作大型模块的容器是个坏主意吗?

感谢您的帮助:)

游戏引擎不是跨平台的主要候选引擎,因为它们通常涉及与低级API(不是跨平台)的有效交互。

类的大小取决于它包含的成员变量,而不是它实现的函数的数量。

堆栈空间通常很小(http://msdn.microsoft.com/en-us/library/ms686774%28v=vs.85%29.aspx)而堆理论上与可用RAM一样大。所以,如果你有非常大的东西,就把它堆起来(和新的)。

"启动屏幕":不要在程序开始时做所有的工作。用户讨厌当他们运行程序时,屏幕上什么都不显示,因为你的程序正忙于初始化一些东西。。。查找懒惰的实例化,基本上不做可以等待的事情,并且总是在屏幕上显示一些东西。

至于具体答案:1.不,假设没有虚拟功能,就不应该有性能开销。2.请参阅上面的"启动屏幕"answers"有限堆栈空间"。3.模块性通常是好的,只要确保每个类都代表一个"事物"即可。但是不要有太多的类,你会忘记它们的名称和用途:)

这样做被认为是不好的做法吗创建一个类整体实例化一次应用也许是因为某种性能命中或添加使用类产生的开销而不是一堆函数?

一点也不。这主要是因为应用程序类可以执行继承和封装之类的操作。没有性能打击或增加开销。

我一直在计划拥有WinMain将Engine的实例创建为局部变量。Engine类将相当大,包含类用于渲染、脚本解析、文件基本上整个游戏引擎,除了操作系统具体代码,将包含在某种形式的Engine类(可能是另一个例子类。)正在创建本地实例我的大型发动机类WinMain函数是个坏主意?是创建本地实例是个坏主意当程序启动,当程序结束?也许新的较好的

不——这几乎是它应该走的路。为什么要麻烦进行堆分配?您需要自动销毁语义。除非你的类有很大的大小,数百KB或更多,在这种情况下,基于RAII的堆分配更明智,因为堆栈内存非常有限。也就是说,sizeof()报告的每个实例的物理静态大小,不包括动态分配。

我的计划是分开发动机分为"模块",每个模块由类表示。发动机类将包含的实例几乎所有其他模块,如上面提到的,渲染,文件系统交互等。正在使用类作为大型模块的容器从某种角度来看是个坏主意(性能、设计、可读性?)

这正是面向对象设计的目的——封装,将程序划分为明确定义和分离的模块,然后实例化您需要的每一个模块,这就是面向对象编程背后的理念。类封装的概念的大小通常被认为是无关的,只要它是一个单独的概念。清晰的模块化设计非常棒。

我建议对所有依赖平台的应用程序使用运行时继承,最好在运行时动态加载(使用OS类执行动态加载)。这加强了坚实的编译时抽象,并允许更高效的编译。

  1. 不,建议做任何能让设计更干净、更易于维护的事情
  2. 不,应尽可能避免直接使用免费存储(即,除非万不得已,否则不要使用new
  3. 参见#1
  1. 不,它不被认为是糟糕的风格。事实上,我知道没有一个应用程序框架是没有的,著名的Singleton模式基本上是围绕着同一主题(但不同,请注意)

  2. 我无法想象你的课居然这么大。如果是,就把它堆起来。然而,该类的实际内容很可能无论如何都会在堆上(我有点假设你会使用现有的容器类,100个中有99个会进行动态分配;这也适用于STL容器)

  3. 如果将它们放在数据段中,作为堆栈中的auto或类的成员,会有什么不同?我认为这个类利用了模块性,可以让你更容易地做事情(比如单元测试,或者将引擎重新用于纯网络版本等)