在对数组进行操作时,* 和 [] 在效率上几乎是等同的;
但是对于一些重载了操作符[]的一些成员函数来说,[]和*就不是一个概念了,在效率上[]至少要比*慢数十倍;
我们通过stl中的vector来说明:
样例一:
std::vector<int> text;
text.resize(100000);
DWORD start,finish;
for (int i=0; i<10000000; i++)
{
text[i%100000];
}
finish = ::GetTickCount();
样例二:
std::vector<int> text;
text.resize(100000);
DWORD start,finish;
std::vector<int>::iterator ptr;
ptr = text.begin();
start = ::GetTickCount();
for (int i=0; i<10000000; i++)
{
*(text + i%100000);
}
finish = ::GetTickCount();
通过程序调试验证,发现样例一用时578ms,样例二用时34ms;两者之间相差很多,如果不考虑取模运算所带来的时间开销的话,两者之间的性能差不会下于100倍吧
我想样例一中获得数据之所以如此慢的原因在于中间有一个函数调用的过程,因为重载了操作符就相当于一个函数,而函数调用的开销是很大的,在样例二中就是对内存的直接操作,没有函数调用所带来的开销
同样的在MFC中的CArray类也会存在这种情况;
所以在对关于重载了操作符[]来获取数据,如果数据量大的话,我们应该避免操作符的运用,而是直接去操作数据内存获取
欢迎大家评论交流,路过的高手欢迎指出本文中的不足的地方