我经常遇到这样的问题,即我的某个函数需要更大的内存来进行某些内部计算。 该函数将被高频率调用。 可能是内存量太大而无法放入堆栈的情况。因此我必须分配和释放内存。 但是,我非常担心这种频繁的、不必要的分配/释放所造成的开销。
我目前看到以下选项:
- 每次分配/释放
- 使用静态变量来保持该内存与共享指针相结合,以确保安全销毁分配的内存
- 使用全局(或文件范围)内存来保持整个时间分配的内存。
- 将函数封装在一个类中,并添加一个成员变量来保存分配的内存(这里我最关心的是
关于方法 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/