gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:32:28 25 4
gpt4 key购买 nike

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

我目前看到以下选项:

  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/

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