c++ - 最佳实践 : Frequent usage of big temporal buffer within function (C++)

标签 c++ memory-management

我经常遇到这样的问题,即我的某个函数需要更大的内存来进行某些内部计算。 该函数将被高频率调用。 可能是内存量太大而无法放入堆栈的情况。因此我必须分配和释放内存。 但是,我非常担心这种频繁的、不必要的分配/释放所造成的开销。

我目前看到以下选项:

  1. 每次分配/释放
  2. 使用静态变量来保持该内存与共享指针相结合,以确保安全销毁分配的内存
  3. 使用全局(或文件范围)内存来保持整个时间分配的内存。
  4. 将函数封装在一个类中,并添加一个成员变量来保存分配的内存(这里我最关心的是

关于方法 3-4:我最关心的是实际上这个内存中的值只在这个函数中有效,并且只应该在那里使用。但是,实际上变量的范围更大,很容易误用或意外使用变量。必须明确的是,它并不打算在函数之外使用这些变量。 我现在最喜欢的是选项 2。 我很高兴听到您对这种情况下最佳实践方法的意见。

稍微修改的问题: 想象一下,我们现在有一个成员方法而不是一个独立的函数。 在这里,我最喜欢的方法 2 不再适用,因为该类的所有实例都将共享相同的计算缓冲区。因此,我认为只有两种选择: 1.每次分配/释放 2. 为每个插件使用一个成员变量来保持分配的内存。

关于方法 2,我再次产生了一些不信任:成员变量可以被同一个类中的所有函数访问,尽管预期范围应该仅用于此单个成员函数中的时间计算。

也许这个变量的一些命名约定以及注释会有所帮助: 例如

...
private:
/** this variable is only intended to be used temporarily within fct1 */
std::shared_ptr<std::array<double, 10000>> tmpBuffer;
...

最佳答案

您在“略微修改”问题中的方法似乎是合理的。如果您有一个函数重复操作某些数据,这些数据在某些其他范围内以有限的方式使用,但不打算让整个程序访问,这可能是一个提示,即该数据和那些函数应该绑定(bind)在一起作为同一个类中的成员和方法。一旦定义了该类,它的实例的生命周期就可以通过范围界定、std::shared_ptr 或类似方式等常用方式更简单地处理。

此时,除非您有进一步的具体证据表明该类的作用域和布局导致了问题,否则明智的做法是相信编译器、CPU 缓存等正在为您做出正确的选择,直到分析数据证明否则。

关于c++ - 最佳实践 : Frequent usage of big temporal buffer within function (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58123594/

相关文章:

c++ - 了解 GLSL 统一缓冲区 block 对齐

iphone - 应用程序 :didFinishLaunchingWithOptions: memory management

python - Python 是否有堆栈/堆以及如何管理内存?

c++ - 在 Qt 开发人员中将 double 转换为 int

c++ - 为什么包含任意 STL header 可以解决这些编译错误?

c++ - 具有依赖类型的字符串字面量——不可能?

java - 编译器生成的相对地址以及它们如何在(最好是 java)字节码中表示?

memory-management - 监控 Spark 作业的内存使用情况

ios - Instruments Heapshots——这个数据是什么意思?

c++ - 在共享库中使用静态 std::string 的问题