【问题标题】:Cost of instance members vs. static members vs. non-class methods实例成员与静态成员与非类方法的成本
【发布时间】:2019-01-10 23:16:41
【问题描述】:

这是一个相当笼统的问题,但我还没有为 C++ 找到明确而具体的答案。

我有一个包含许多方法的类,它可能有大量实例同时实现,同时调用几个对时间要求严格的方法 (

现在动态方法与静态方法或非类方法的内存成本如何?在任一选项中都有大量实例时是否存在内存不足的风险?

如果我错过了准确回答此问题的参考资料,请原谅我或给我提示如何继续,提前致谢!

【问题讨论】:

  • 测量。 [[[[[[
  • 除了“在任一选项中是否存在大量实例时内存不足的风险?”,这个问题对我来说没有意义。
  • 与其尝试描述一些代码,不如尝试创建一个Minimal, Complete, and Verifiable Example显示我们。也请read about how to ask good questionsthis question checklist
  • 方法(静态,非类)不会影响内存消耗。它的sizeof(a instance) + [all the dynamic memory allocated inside instance] 实际上会影响程序的总内存消耗。如果您将方法声明为非类,那么您打算如何将类中存在的所需数据传递给这些非类方法?
  • 切换到非类我需要更改方法签名,添加实例引用以访问其成员。我需要尝试看看它是如何编译和执行的。关于内存消耗,我猜一个实例必须为其自己的成员保留一些专用空间,包括属性、指针的内存分配、堆栈地址、异常分支等,而对于静态或非类方法,该内存空间将仅分配一劳永逸。我将用 sizeof(type) 测试和测量这一点。

标签: c++


【解决方案1】:

您找不到具体答案的原因是,尝试预测优化器的工作方式可能很困难。

我最近在尝试获得this question 的答案时,对代码进行了比平时更深入的研究,其中一个本应完全无害的更改对性能产生了微小但可衡量的影响。

如果您阅读了我对代码进行的深入研究的结果,优化有点像蝴蝶原理。一个微小的变化可能会产生“涟漪效应”,产生的影响比您乍看之下预期的要大得多。当然,在那种情况下它只有 3% 左右,但在时间关键的代码中,这可能很重要。我知道,我去过那里。 ;)

因此@Cheers and hth - Alf 是 100% 正确的。您可以绝对确定的唯一方法是尝试所有可能的组合并对其进行基准测试。

【讨论】:

    猜你喜欢
    • 2015-08-23
    • 2012-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-04
    • 1970-01-01
    • 2016-05-20
    • 1970-01-01
    相关资源
    最近更新 更多