1
75
如果没有别的,A
这是一个伟大的胜利,不介意任何性能差异。 |
2
25
我们使用的准则是: 总是喜欢常量而不是非常量 如果您倾向于使用const对象,那么您将习惯于只对所获得的对象使用常量操作,这与使用 常数迭代器 尽可能多。 有一个恒心 病毒的 财产。一旦你开始使用它,它就会传播到你的所有代码中。您的非可变方法变为常量,这要求对属性只使用常量操作,并传递常量引用,而本身只强制执行常量操作… 对我来说,与非常量迭代器(如果有)相比,使用常量迭代器的性能优势远不如代码本身的改进重要。操作意味着(设计)是非变异的 是 常数。 |
3
18
它们适用于非平凡的容器/迭代器。把你的习惯弄清楚,当它真的很重要时,你不会失去表现。 此外,有几个原因可以选择const_迭代器,不管是什么:
作为上面最后一点的例子,这里是qt中qmap.h的摘录:
即使迭代器和const_迭代器实际上是等效的(除了
当然,还有其他方向的数据点:
|
4
14
我不明白他们为什么会这样做-常量是编译时检查。但显而易见的答案是写一个测试。 编辑: 这是我的测试-它在我的机器上给出相同的计时:
|
5
7
它取决于您使用的容器和实现。
对,
对于某些容器,const迭代器和可变迭代器的实现 可能不同 . 我能想到的第一个例子是 SGI's STL rope container . 可变迭代器具有指向父行的额外指针,以支持更新。这意味着额外的资源浪费在引用计数更新+指向父绳的指针的内存上。见 implementation notes here .
然而,正如其他人所说,编译器不能使用
|
6
6
看看这个 article by Scott Meyers here . 他解释了为什么人们应该更喜欢迭代器而不是常量迭代器。 |
7
3
它们应该是相同的,因为常量是编译时检查。
为了证明自己没有怪癖,我取了anon的代码,修改后使用
然后我让编译器(gcc 4.5.2-o3)生成 装配输出 并对这两个回路进行了目视比较: 完全相同的 (除了一对寄存器加载顺序相反)
|
8
2
当您对其中任何一个进行基准测试时,请确保使用适当的优化级别——您将使用“-O0”和“-O”等获得完全不同的计时。 |
9
1
|
10
1
与访问限制(公共、受保护、私有)一样,“常量”对程序员的好处大于它对优化的帮助。
|
11
0
根据我的经验,编译器在使用常量迭代器时不会进行任何可测量的优化。尽管语句“it could”为真,并且引用没有定义为标准中的指针。 但是,可以有两个对同一对象的引用,因此一个可以是常量,一个不是常量。那么,我猜答案在 this thread on restrict pointers 应用:编译器无法知道对象是被另一个线程(例如)更改,还是被某些中断处理代码更改。 |
Incomputable · 可以重用常用迭代器来构建常量迭代器吗? 7 年前 |