我需要堆栈溢出的意见来解决一些一直存在于我脑海中的关于循环效率的问题。现在,当我开始编程时,“让它工作”是一个很大的优先事项,我的大多数for循环看起来都是这样的。
for (int i = 0; i < N; i++) {;}然后我被启发了,特别是在C++开发中,预增量减少了一些调用,考虑到这将是N个调用,而且它不会改变我养成的习惯。
for (int i = 0; i < N; ++i) {;}这在一段时间内已经足够好了,但重点是可读性,在阅读了Steve McConnell完成的一些代码后,我得出了以下结论。
for (int loop_index = 0; loop_index < loop_count; ++loop_index) {;}并且这些变量会根据代码的上下文而变化。然后,我阅读了一些关于内置类型、构造函数和赋值的有效C++。基本上,两者之间的区别
int i = 42;和
int i(42); 前者调用构造函数和赋值运算符,而后者仅调用构造函数。所以我在写代码的时候把它写进了我的程序中。所以我的问题是,这是编写for循环的最有效和最易读的方式吗:
for (int loop_index(0); loop_index < loop_counter; ++loop_index) {;}发布于 2012-08-08 21:35:50
实际上,
for (int i = 0; i < N; i++) {;}很好。i是一个int,所以编译器无论如何都会优化后增量。是否使用int i(42);或int i = 42;初始化int也是一个喜好问题。
我也会调用迭代器i,而不是loop_index。前者是普遍被理解的,而后者是奇怪的。
但是,如果您正在处理迭代器,情况就会发生变化。it++可能仍然会被优化为++it,但在这里,我更倾向于使用前增量。
发布于 2012-08-08 21:35:35
如果你没有使用迭代器,那也没关系,因为编译器会把它翻译成相同的代码。
附录:如果你使用迭代器:
for(vector<int>::iterator i = a.begin(); i != a.end(); ++i)那么++i就是i.operator++(),i++就是i.operator++(整型),这可能意味着两个不同的东西。
顺便说一句。如果这是一个问题,您可以测量性能。
发布于 2012-08-08 21:35:41
首先,你的最后一点是不正确的。这一行
int i = 42;复制初始化(请参阅此相关GoTW)。那里没有赋值。对于任务,您需要
int i;
i = 42;其次,在处理诸如整数类型之类的内置代码时,编译器生成的代码可能没有区别。您应该分析不同的选项并查看。
https://stackoverflow.com/questions/11865628
复制相似问题