为什么++i比i++更高效?
Why is ++i more efficient than i++?
根据Google c++风格指南,"当返回值被忽略时,'pre'形式(++i
)的效率绝不会低于'post'形式(i++
),而且通常效率更高。"
i++
增加i
并返回i
的初始值。这意味着:
int i = 1;
i++; // == 1 but i == 2
但是++i
返回实际增加的值:
int i = 1;
++i; // == 2 and i == 2 too, so no need for a temporary variable
在第一种情况下,编译器必须创建一个临时变量(当使用时)来返回1
而不是2
(在它不是常量而是动态值的情况下,例如调用的返回值)。
在第二种情况下,它不需要。因此,第二种情况至少可以保证同样有效。
通常,编译器能够将第一种情况优化为第二种情况,但有时可能无法。
无论如何,我们谈论的是非常微不足道的影响。
但是对于更复杂的对象,如iterators
类对象,如果迭代数百万次,拥有临时状态可能会相当慢。
经验法则
使用前缀版本,除非你特别想要后缀语义
引用自:
http://www.parashift.com/c + + faq/increment-pre-post-speed.html
++i有时比i++快,但从来不会比i++慢。
对于像int这样的固有类型,这无关紧要:++i和i++是相同的速度。对于像迭代器这样的类类型,++i很可能比i++快,因为后者可能会复制this对象。
i++的开销,如果有的话,可能不会有任何实际的区别,除非你的应用是CPU限制。例如,如果你的应用程序花费大部分时间等待某人点击鼠标、执行磁盘I/O、网络I/O或数据库查询,那么浪费一些CPU周期不会影响你的性能。然而,输入++i和i++一样容易,所以为什么不使用前者呢?除非你确实需要i的旧值。
所以如果你把i++写成一个语句,而不是一个更大的表达式的一部分,为什么不直接写++i呢?你永远不会失去任何东西,有时还会得到一些东西。老的C程序员习惯于写i++而不是++i。例如,他们会说
for (i = 0; i < 10; i++) ....
由于这将i++用作语句,而不是更大表达式的一部分,因此您可能希望使用++i。对于对称性,我个人提倡这种风格,即使它不能提高速度,例如,对于内部类型和带有返回void的后缀操作符的类类型。
i++ -使用i后值递增++i -值立即加1
可能会有性能差异,因为++i要求立即增加i,句号。i++继续建议,在它被增加之前可能需要I。该值可能在增加之前存储在某个地方。
自增(或自减)操作符涉及两个操作:自增和取两个值(旧值或新值)中的一个作为表达式的结果。差别在于该选哪一个。
如果取前置形式,则先自增,然后取新值。
如果您使用post-form,则取旧值,保留它,增加它,将新值放入旧位置并返回旧值。这听起来更复杂——事实也是如此。
但是,如果表达式的返回值被忽略,则无论您使用的是内置类型还是对象,都不会有任何区别。
对于迭代器和其他模板类型,使用预增量
这是因为当您进行后增量操作时,您必须:
- 改变值,同时
- 将旧值赋给其他值
简单地说,您必须保留该变量的两个副本,并且复制和删除是需要额外时间的…
- C++中高效的大型稀疏块压缩线性方程
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- 如何在C++中高效地构造随机骰子
- 如何实现高效的算法来计算大型数据集的多个不同值?
- 更高效地在微控制器上对C++进行基准测试
- 从C++无序集合中高效提取元素
- 高效的字符串截断算法,按顺序删除相等的前缀和后缀
- C++中特征对角矩阵类型的高效存储
- 高效简单的结构比较运算符
- 使用 Rcpp 的高效矩阵子集
- C++ 包含特征矩阵的类的高效算术运算符重载
- CUDA 高效的 nd-array(张量)切片
- 大多数基本类型的高效二进制序列化
- RAM高效C++属性
- 如何为球形物体和三角形地形提供高效的碰撞检测和响应
- 如何实现四个 i8 元素组的高效_mm256_madd_epi8点积
- 如何在嵌套映射(C++)中高效地查找密钥
- 在C++中高效地保存许多连续记录的图像
- C++ - 将函数链接到触发器的有效和高效方法
- C/C++ 中的高效 pcap 解析器