重新审视C++中的大括号和性能
Revisit curly braces and performance in C++
我知道这个问题已经在这里被问过和回答过,但没有一个答案涉及我(几年前)因"不必要的"大括号对性能产生不利影响的原因。有鉴于此,我想重新审视这个问题。
简而言之,有人告诉我:
if(true)
do_something();
性能高于
if(true)
{
do_something();
}
我记得给出的原因是,在第二种情况下,编译器会在组装的代码中引入一个分支,这可能会产生累积效应。
现在,我可以拼写成文器,但除此之外,我对它们的运作方式知之甚少,那么上述理论是正确的吗? 这是真的吗?
在未优化和优化生成的代码中,这两个语句将转换为完全相同的语句。大括号创建了一个新作用域,其中没有声明任何内容,因此从语义上讲,任何内容都不能以不同的方式实现。(除非一个愚蠢的编译器会管理这个内部块的空堆栈帧?!
那么上述理论是否属实呢?
不。
这是真的吗?
不。
即使最糟糕的古代编译器缺乏聪明的优化策略,我也无法想象这些语句会发出不同的断言代码。
这些将简单地作为对do_something
子例程的调用发出。
你得到的"事实"完全是虚构的。正如人们在您提供的链接中已经提到的那样,根本没有性能降低。
我们没有办法解释不真实事物的推理。
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 使用新行和不使用新行读取文件
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- OpenMP阵列性能较差
- 递归列出所有目录中的C++与Python与Ruby的性能
- 遇到新行时,有没有办法停止istream_iterator
- 大小相等但成员数量不同的结构之间的性能差异
- 为什么constexpr的性能比正常表达式差
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 在类中使用随机生成器时出现性能问题
- 当一个新对象被分配到它的地址时,对象是否必须被销毁
- 模板元编程:如何将参数包组合成新的参数包
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 如何使用CLion在Mac上创建一个新的.txt文件
- 错误-我无法在VS2019中打开新的Qt项目
- 使用 task_group 的英特尔线程构建模块性能不佳(新用户)
- 使用较新版本的 g++ 导致多线程性能下降?
- 重新审视C++中的大括号和性能