c++ - 编译器会简化按顺序执行多次的操作吗?
问题描述
我已经有这个问题很长时间了,但不知道在哪里看。如果某个操作被多次编写,编译器会简化它还是会运行完全相同的操作并得到完全相同的答案?
例如,在下面的类似 c 的伪代码(i%3)*10
中重复了很多次。
for(int i=0; i<100; i++) {
array[(i%3)*10] = someFunction((i%3)*10);
int otherVar = (i%3)*10 + array[(i%3)*10];
int lastVar = (i%3)*10 - otherVar;
anotherFunction(lastVar);
}
我知道变量对于视觉目的会更好,但它也更快吗?(i%3)*10
每个循环计算5次?
在某些情况下,我不知道是使用变量更快还是离开原始操作更快。
编辑:在 win 10 上使用 gcc (MinGW.org GCC-8.2.0-3) 8.2.0
解决方案
进行哪些优化取决于编译器、您指定的编译器优化标志和体系结构。
以下是您的示例的一些可能的优化:
- 循环展开这会使二进制文件变大,因此是一种权衡;例如,您可能不希望在内存很少的微型微处理器上使用它。
- 通用子表达式消除 (CSE)您可以非常确定
(i % 3) * 10
每次循环迭代只会执行一次。
关于您对视觉清晰度与优化的担忧:在处理像您这样的“本地情况”时,您应该关注代码清晰度。
优化收益通常是在更高的水平上获得的;例如在您使用的算法中。
关于优化有很多话要说;以上只是一些开场白。很高兴您对事物的工作方式感兴趣,因为这对于优秀的 (C/C++) 程序员很重要。
推荐阅读
- c# - System.BadImageFormatException:不应加载引用程序集以执行
- python - 如何在此代码中实现没有 Visualize_cam 的 CAM?
- python - 烧瓶用户:无法安装烧瓶用户我得到一个权限错误
- java - JPanel 覆盖部分 JFrame 边框
- testing - 使用 TestCafe 和 Electron,有没有办法在最后一次测试之后但在应用程序关闭之前执行脚本?
- reactjs - It Hit WebDAV 客户端模块在打开 word 文档时要求登录
- python - 使用 matplotlib python 在 3D 中绘制多个相交平面
- tensorflow - Tensorflow、TRT模型安装问题
- database - 大型 JSON 作为本地数据库反应原生
- php - 将单词字符串转换为唯一数字