目前我正在使用“->”运算符取消引用类中的成员。我的问题是它是否比普通成员(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/