Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对于内存来说,什么更昂贵&引用;“创建和删除对象”;或;重用一个对象;?_C++_Visual C++ - Fatal编程技术网

C++ 对于内存来说,什么更昂贵&引用;“创建和删除对象”;或;重用一个对象;?

C++ 对于内存来说,什么更昂贵&引用;“创建和删除对象”;或;重用一个对象;?,c++,visual-c++,C++,Visual C++,我有一个在整个游戏过程中每10秒需要的对象。 我应该继续删除该对象还是继续使用同一对象? 所谓“自由时间”的对象在哪里 因为这是一款手机游戏,记忆是一个问题。 所以,我只是想知道哪种方法会有成效 "creating and deleting objects" ? 或 谢谢这在很大程度上取决于对象的性质和程序其余部分的内存使用情况,但根据经验: 如果在整个程序中需要对象,请将其保存在内存中。如果它很小,那就没关系了。如果它很大,那么每十秒钟重新创建一次它将对处理器造成压力,分配也可能会造成影响

我有一个在整个游戏过程中每10秒需要的对象。 我应该继续删除该对象还是继续使用同一对象? 所谓“自由时间”的对象在哪里

因为这是一款手机游戏,记忆是一个问题。 所以,我只是想知道哪种方法会有成效

"creating and deleting objects" ?


谢谢

这在很大程度上取决于对象的性质和程序其余部分的内存使用情况,但根据经验:

如果在整个程序中需要对象,请将其保存在内存中。如果它很小,那就没关系了。如果它很大,那么每十秒钟重新创建一次它将对处理器造成压力,分配也可能会造成影响


如果您选择按照我的建议保持对象的活动状态,那么当它未被使用时,它将驻留在RAM中并占用一些空间(假设您的移动平台没有交换内存)。

重用对象的成本更低,尤其是在创建和删除操作成本较高(绘图、磁盘访问、下载)的情况下,但是缓存中有太多可重用对象可能会填满你的内存

当对象不再使用时,调用析构函数以释放内存。但是,如果随后创建相同类型的新对象,则会调用构造函数以分配新内存。这当然会降低性能(但在实践中,它也取决于对象的大小),因此,如果在程序执行期间不再需要对象,则应通过更改其内容来重用它。

探查器会怎么说

这在很大程度上取决于对象、编译器和使用的类型 我们正在努力。有一次我在
g++
库,每次通过循环重新初始化), 每次在循环中重建对象的速度更快。上 另一方面,大多数其他标准容器甚至可以保留它们的内存 清空时;在这种情况下,如果在 循环之后,它(通常)会相当快地达到最终大小 不会有其他分配

当然,你必须考虑恢复是多么困难。 将对象还原为原始状态。这几乎是不可能的 例如,派生自
std::ios_base
;您几乎总是想使用 新的
std::ostringstream
,而不是试图重用现有的。
不管成本如何。

是否重用对象或内存?你说这两个是什么意思?这要看情况了。这取决于您的需求,取决于您对分配器的选择,取决于对象,取决于使用模式。尝试澄清您的需求,然后测量“调用构造函数是为了分配新内存”-实际上不是这样。构造函数可能会分配内存,也可能不会。@SteveJessop:构造函数通常用于分配新内存。此外,默认构造函数调用拥有它们的所有成员的默认构造函数。如果有一个成员有一些构造函数,但没有默认构造函数,那么这就是编译时错误(请参阅)。只有当构造函数中有一行(或基类或成员构造函数中的一行)分配内存时,才分配内存,并带有
new
malloc
或其他任何内容。@SteveJessop:带有空体且没有参数的用户定义构造函数相当于编译器生成的默认构造函数。说这种类型的构造函数不采取任何操作是错误的。如果我写
myobjectobj(没有<代码>新< /代码>),编译器使用它的默认构造函数。考虑<代码> StuttMyObjult{int I;MyObjutt():i(0){}};<代码>。然后,如果我写
myobjectobj,构造函数不分配任何内存。因此,它不是“为了分配新内存而调用的”。在一个简单的循环中进行内存测试是不公平的。原因是,它只会以相同的顺序创建和销毁对象,因此内存上的一个块可以不断重复使用(也就是说,内存管理器没有任何实际工作要做)。@edA-qamart-ora-y。但这就是当时的问题:重用循环上方声明的
std::string
,或者在循环中每次重新创建一个std::string,并为其分配一个新值,是更快的方法吗。我非常确定结果是
std::string
的g++实现的产物:与所有测量一样,绝对不能保证您最终会在不同的编译器和不同的库中得到类似的结果。我的观点是,不测量就无法判断。我只是补充说,很难正确测量,简单的隔离回路通常不是公平的测试。@edA-qamort-ora-y很难正确测量。您必须或多或少地模拟实际代码,以使度量具有相关性。在本例中,简单循环确实模拟了实际代码:我们在循环中构造字符串,并将它们插入
std::vector
成员。(这可能是一种常见的模式。)
"reusing a object" ?