【问题标题】:Class methods variables, is it faster if I store them in the class itself?类方法变量,如果我将它们存储在类本身中会更快吗?
【发布时间】:2017-11-12 02:25:44
【问题描述】:

考虑下一段代码

class foo {
public:
  void f() { 
    char buffer[1024];
    memset(buffer, NULL, 1024);
    read_some_input_to_buffer(buffer, 1024);
  }
};

class bar {
public:
  void f() {
    memset(_myPrivateBuffer, NULL, 1024);
    read_some_input_to_buffer(_myPrivateBuffer, 1024);
  }

private:
  char _myPrivateBuffer[1024];
};

bar::f() 会比foo::f() 工作得更快吗?如我所见,缓冲区已经存在于bar 中,所以调用函数时编译器不会在堆栈上为其分配内存?还是我错了,在调用foo::f() 之前已经分配了内存?

【问题讨论】:

  • 在堆栈上分配内存不需要时间。
  • 调用函数时,堆栈指针会根据所有局部变量使用的空间量进行调整。所有这一切都是改变它被调整的数量,但它必须在有或没有局部变量的情况下进行调整。
  • 这是一个无用的过早优化的经典案例。您是否使用分析器确定内存分配是影响代码性能的瓶颈?如果答案是,那么你就是在浪费时间,应该继续讨论真正的问题。
  • 如果局部变量是一个有构造函数的类对象,那就不一样了,那么它必须调用构造函数和析构函数。但对于 POD,根本没有开销。
  • @KenWhite 我为什么要介绍这个?我宁愿在stackoverflow上问一个更一般的问题,并得到一个真正能教给我的好答案。 “真正的问题”是什么意思?我想更好地了解我的代码是如何运行的

标签: c++ arrays performance function memory


【解决方案1】:

如果我将它们存储在类本身中会更快吗?

所以编译器不会在堆栈上为其分配内存

在栈上分配内存相当于移动栈指针。更重要的是,堆栈总是热的,你获得的内存比任何远堆分配的内存更有可能在缓存中。在Which is faster: Stack allocation or Heap allocation 中阅读更多内容。


PS:小心不要成为过早优化的受害者。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-14
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多