c++ - 如果您通过引用传递变量,则冗余 mov 操作
问题描述
如果您更改通过引用传递的变量,现代 C++ 编译器是否有任何理由无法优化冗余mov指令?
慢:https ://gcc.godbolt.org/z/2Bmidk
冗余移动:
10: mov QWORD PTR [rdi], rdx
快速:https ://gcc.godbolt.org/z/u3GMLx
为什么编译器不将begin_变量存储在 CPU 寄存器中并在函数结束时将其写入内存?
解决方案
似乎它可能是无效的优化。如果begin_
等于this
ieCharStream
本身的地址怎么办(并且使用 读取任何对象的字节都是有效的char*
)?在这种情况下,第一次读取后CharStream
会发生变化,因此 range [begin; 结尾)
为避免这种情况,您可以执行以下操作之一:
- 按值接受 CharStream (因此它的地址是唯一的,并且不与任何地址重合
char*
):https://gcc.godbolt.org/z/QfOUwW(注意行为的变化。如果你需要返回流需要修改) - 使用另一种类型而不是
char
这样它就不能使用别名CharStream
:https://gcc.godbolt.org/z/2_gREfByte*
(请注意,使用而不是读取数据可能是未定义的,char*
因为它some_other_type*
最初是)
推荐阅读
- haxe - 可以制作名为“Map”的自定义类,并且仍然引用 Haxe“Map”类吗?
- visual-studio-2017 - 如何防止 vc_redist.x##.exe (VS2017) 由于挂起的重新启动而出现模棱两可的失败?
- html - 输入类型号默认为 0,但如果它从 1 开始,则在提交时进行验证
- docker - docker-compose 运行现有容器
- asp.net-mvc - 在日期之间执行搜索时出现 ASP .NET MVC 错误
- c# - 在 MouseEnter 中使用 while 循环
- parsing - 如何将 S 表达式解析为 Haskell 中的数据结构?
- spring - 一键查找 Eclipse 中不同 spring 配置文件中的 bean 定义
- c# - 从挂起的用户输入强制更新 Outlook 对象模型
- .net - 如何将 Unity Container 配置为不解析未注册的 Ienumerable