Mat*_* M. 16
有趣的问题.
那么,会发生什么?好吧,如果您使用gdb进行调试,您将看到类似3个成员变量的内容(名称不准确):
_M_begin:指向动态数组的第一个元素的指针_M_end:指针超过动态数组的最后一个元素_M_capacity:指针一个超过可以存储在动态数组中的最后一个元素因此,实施vector<T,Alloc>::size()通常简化为:
return _M_end - _M_begin; // Note: _Mylast - _Myfirst in VC 2008
Run Code Online (Sandbox Code Playgroud)
现在,在考虑可能的实际优化时,有两件事需要考虑:
换一种说法:
size自己,很有可能它会像编译器得到它一样快......无论如何,我真的怀疑这是值得的麻烦.这是一个微观优化,并且不太可能产生很大的改进.
sta*_*ica 11
据我了解1998 C++规范,vector<T>::size()需要恒定时间,而不是线性时间.因此,这个问题可能归结为读取局部变量比调用一个功能很少的函数更快.
因此,我声称将矢量存储size()在局部变量中会使程序加速一小部分,因为您只需调用该函数(因此执行所需的时间很少),而不是多次.
vector :: size()的性能:它是否与读取变量一样快?
可能不是.
有关系吗
可能不是.
除非你每次迭代所做的工作很小(比如一个或两个整数运算),否则开销将是微不足道的.
在我所看到的每个实现中,看到vector::size()它都会减去end()和begin(),即它没有读取变量那么快.
实现向量时,实现者必须在最快的元素之间做出选择,end()或者size(),在最后一个初始化元素之后将初始化元素的数量或指针/迭代器存储到元素之间.换一种说法; 使用迭代器进行迭代.
如果您担心size()性能,请像这样编写基于for循环的索引;
for (size_t i = 0, i_end = container.size(); i < i_end; ++i){
// do something performance critical
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9508 次 |
| 最近记录: |