如果不使用结果值,则i++++i之间是否存在性能差异?

推荐答案

执行摘要:否.

i++可能比++i慢,因为原来的值是i

我们可以通过查看此函数的代码来演示这一点,

$ cat i++.c
extern void g(int i);
void f()
{
    int i;

    for (i = 0; i < 100; i++)
        g(i);

}

除了++ii++之外,文件是相同的:

$ diff i++.c ++i.c
6c6
<     for (i = 0; i < 100; i++)
---
>     for (i = 0; i < 100; ++i)

我们将编译它们,并获得生成的汇编程序:

$ gcc -c i++.c ++i.c
$ gcc -S i++.c ++i.c

我们可以看到生成的对象和汇编程序文件是相同的.

$ md5 i++.s ++i.s
MD5 (i++.s) = 90f620dda862cd0205cd5db1f2c8c06e
MD5 (++i.s) = 90f620dda862cd0205cd5db1f2c8c06e

$ md5 *.o
MD5 (++i.o) = dd3ef1408d3a9e4287facccec53f7d22
MD5 (i++.o) = dd3ef1408d3a9e4287facccec53f7d22

C++相关问答推荐

我可以在同一个文件中使用 time.h 中的两个 tm 结构吗?

这两个具有递归函数和静态变量的 C 程序谁有不同的输出?

CS50:滤镜边缘主要返回白色图像

在 c 标头中使用 c++ 标头中的枚举类

如何在一个 SIMD 向量中创建一个 0 索引的左压缩向量?

C 中使用数组、推送、弹出和显示的堆栈实现

fork() - 多次调用子代码(相同的 PID)

如何在数组中打印二进制数?

使用整数存储许多布尔值是否值得?

C/C++ 编译器如何区分常规二维数组和指向数组的指针数组?

C中块内的函数声明

printf() - 如何添加前导零 + 填充

为什么这个 .c 文件 #include 本身?

以编程方式获取缓存行大小?

在结构数组的末尾需要空括号“{}”是什么?

为什么在启用 GCC 优化的情况下,这段代码使用 strlen 的速度要慢 6.5 倍?

如何检测 C 代码(需要'extern C')是否在 C++ 中编译

编译 HTK 时出现“致命错误:bits/libc-header-start.h:没有这样的文件或目录”

if-else 块中的“if (0)”块的目的是什么?

“for”循环内的“for”循环可以使用相同的计数器变量名吗?