c++ - 访问堆成员和堆栈对象之间的性能差异?

标签 c++ class pointers member

目前我正在使用“->”运算符取消引用类中的成员。我的问题是它是否比普通成员(member)访问速度更快。例如:

Class* myClsPtr = new Class();
myClsPtr->foo(bar);

对比

Class myCls;
myCls.foo(bar);

可以在没有性能差异的情况下使用这两种方式吗?

最佳答案

首先,

Class myCls = new Class();

是无效代码...让我们假设您的意思是

Class myCls;

几乎没有明显的区别,但您可以通过在循环中迭代一百万次来自己对其进行基准测试,并在计时两个执行时间时调用任一变体。

我刚刚在我的笔记本电脑上做了一个快速而肮脏的基准测试,迭代次数为一亿次,如下所示:

堆栈对象

struct MyStruct
{
    int i;
};

int main()
{
    MyStruct stackObject;

    for (int i = 0; i < 100000000; ++i)
        stackObject.i = 0;

    return 0;
}

然后我跑了:

g++ main.cpp && time ./a.out

结果是:

sreal   0m0.301s
user    0m0.303s
sys 0m0.000s

堆对象

struct MyStruct
{
    int i;
};

int main()
{
    MyStruct *heapObject = new MyStruct();

    for (int i = 0; i < 100000000; ++i)
        heapObject->i = 5;

    return 0;
}

然后我跑了:

g++ main.cpp && time ./a.out

结果是:

real    0m0.253s
user    0m0.250s
sys 0m0.000s

如您所见,堆对象在我的机器上进行 100 百万次迭代时稍快一些。即使在我的机器上,对于少得多的项目来说,这也不会引起注意。突出的一件事是,尽管后续运行的结果略有不同,但堆对象版本在我的笔记本电脑上总是表现更好。但是,不要将其视为保证。

关于c++ - 访问堆成员和堆栈对象之间的性能差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23039580/

相关文章:

C++ vector 对象.erase

java - java中的非重写方法?

c++:在原始指针映射中复制、删除和运算符=

c++ - 数学计算和 setprecision() 函数有问题

c++ - 在 C 或 C++ 应用程序中使用 @

java - 使用静态内部类时构建错误

c - 如何调试这段c代码

c++ - 只渲染部分文本 FTGL、OpenGL

c++ - 通过引用将循环计数器或范围声明传递给线程有什么区别?

c++ - 尽管在堆上分配,但值仍被破坏