我正在为我需要计划c ++游戏项目的课程做报告。计划的一部分是估计程序需要多少内存。我真的不确定如何去做那个。
我应该估计变量的数量及其类型,类的数量,功能的数量,用于项目的文件,例如位图文件等...并加上所有这些组合将使用多少内存?我是以完全错误的方式看待这个和/或是愚蠢的吗?随意说!
非常感谢任何帮助。
提前致谢。
答案 0 :(得分:3)
我应该估计变量的数量及其类型
那些只需要很小的空间。对于它的价值,您可以将此数字设置为零(或小常数)。
班级数
类和结构是合乎逻辑的,它们不占用后面程序中的实际空间(除了运行时类型信息,反射等,这些都是可忽略的)。类和结构是程序员构造数据的。但是一旦编译器完成它们,它就像平面数据一样。
功能数量
无关紧要,因为作为所谓程序映像的一部分的函数以与变量和缓冲区不同的方式占用内存。在典型的PC上,它们将在RAM中执行,是的。但是,如果您正在为微控制器开发游戏,那么这些功能将位于只读闪存中,并且根本不会占用任何RAM。
用于项目的文件,例如位图文件等...
那更像是它。但是您还必须查看在运行时动态创建的所有信息。
所以你真正需要注意的是,你的游戏将在缓冲区中放置多少信息;从文件读取或程序生成。例如,编写一个在球体上创建点的程序非常简单:
struct v3 {
double x, y, z;
v3(double x_, double y_, double z_) : x(x_),y(y_),z(z_)
};
std::vector<v3> sphere;
for(int i_phi = 0; i_phi < n_phi; ++i_phi)
for(int i_theta = 0; i_theta < n_theta; ++i_theta) {
double phi = 2*M_PI * (double)i_phi / n_phi;
double theta = M_PI * (double)i_theta / n_theta;
sphere.push_back( v3(
cos(phi) * sin(theta),
sin(phi) * sin(theta),
sin(-M_PI_2 + theta)
));
}
这个程序很容易编译成只有几百个字节的代码。但是说我选择n_phi = 10000,n_theta = 10000然后所需的内存将是(假设sizeof(double)=8
)
sizeof(v3) = sizeof(double)*3 = 24 bytes
sizeof(v3) * 10000 * 10000 = 24 * 100 000 000 = 2.4*10^9 bytes
即。超过2GiB。这就是你应该如何处理这个问题:按照你的程序做的事情来估计它产生的数据量。
答案 1 :(得分:0)
如果您使用的是Visual Studio,请尝试在诊断工具中探索内存管理。否则你可以通过计算图像,变量,数组等的大小来手动估计它。
答案 2 :(得分:0)
您的程序可能会使用
中的内存您可以通过缓存数据进出文件或通过网络缓存数据(以性能为代价或需要偶尔进行缓冲)。
您包含的任何库最终都会从程序启动到静态库,或通过动态库按需加载其功能。
即使您不使用其他库,所有这些C ++ / C函数,许多抽象,vtable都必须存储在内存中,并且需要存储在内存中的内容越多,将使用的内存越多。 / p>
内存泄漏也会增加内存使用量,因为无法再访问内存。
除了理论之外,您还需要研究哪些分析器适合您,并学习如何有效地使用它们来衡量您需要的信息(例如内存使用情况)。
与测量结果相比,完全错误地期望您的程序需要多少内存。除非你习惯于大多数情况,否则我常常会偶尔感到惊讶。
还有其他方法,但很难详尽地讨论它。