gpt4 book ai didi

C++ 内存管理范例

转载 作者:IT老高 更新时间:2023-10-28 23:17:00 25 4
gpt4 key购买 nike

我正在从 C 迁移到 C++11,并试图找出 C++11 程序(或任何具有内置异常的现代语言)的内存管理范例。具体来说,我在游戏开发方面遇到了难题,其中内存耗尽是一个真正的问题。

在 C 语言中,我习惯于检查 malloc 的返回值;并且通常使用自定义分配器。

对于 C++,我很困惑;虽然我喜欢 STL 容器是如何构建允许自定义分配器的。由于 STL 容器都管理自己的内存,简单地向 vector 添加元素可能会抛出 std::bad_alloc。我该如何防范这样的事情?我听说将所有 throwing 调用包装在 try/catch block 中可能会非常昂贵。

但是,允许异常在调用堆栈中向上传播会导致一堆无法完全执行的函数,并会导致一些非常棘手的代码。即如果 A->B->C->D 是一个调用栈,D 抛出,A 捕获,那么 BCD 可能会因为无法正常完成执行而产生一些奇怪的问题。

此外,nothrow 参数似乎允许非常类似 C 的代码;虽然我现在看不到普通 malloc 的好处。

编写异常安全的 C++ 代码以防止内存不足问题有哪些最佳实践?

编辑: A relevant answer on progammers.stackexchange arguing for exception-less C++ design in consoles.不确定这些论点是否仍然适用于 8th generation consoles

最佳答案

我的回答将更多地针对游戏开发,因为这是我的背景,也是您感兴趣的一部分。不同类型的应用程序会有不同的要求。

游戏通常会预先分配所有动态内存并保持在该预算范围内。尤其是游戏机有硬内存限制,大多数游戏都想使用所有这些。

预先分配所有内容有几个原因。

一,性能。内存分配很慢。你想不惜一切代价避免它。如果您预先分配所有内容,那么您可以编写自定义的高性能内存分配器,如池分配器、堆栈分配器等,它们只是从您预先分配的缓冲区中获取内存。为手头的任务选择最佳分配器很重要。

第二,如果没有足够的内存供您的游戏使用,您会很快知道。在开发过程中,如果内存不足并且需要调整使用情况,您会崩溃,但最终版本不应该崩溃,因为您已经预先分配并停留在内存预算内。

对于异常,许多(但不是全部)游戏禁用异常,同样是出于性能原因。事实上,一些控制台编译器甚至不支持异常。然后,您要么需要毫无异常(exception)地使用 STL 库,要么实现自己的容器。许多游戏团队出于性能原因选择实现自己的,以及更好地将它们与自定义内存分配器集成。

也就是说,动态内存分配、STL 和异常对于较小的个人项目/游戏可能非常合适,但请记住对于大型、高性能、实时游戏来说是必要的。

为了异常安全,我肯定会使用 RAII .这就是它的目的。我还建议使用像 std::unique_ptrstd::shared_ptr 这样的智能指针来进行内存管理。再加上 RAII,如果你的构造函数抛出,内存将被释放。

关于C++ 内存管理范例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26133819/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com