大括号的作用域是否用于注释目的,从而降低C++代码的速度
Does curly brace scope for comment purpose slow down C++ code?
用于澄清代码边界的大括号作用域是否会增加代码执行时间?在我看来,确实如此。因为在C++中退出大括号作用域,意味着堆栈展开和小括号作用域用于注释会增加 栈展开您应该关注以下代码片段的代码结构,而不是代码本身。#include <iostream>
#include <utility>
#include <vector>
#include <string>
int main()
{
std::string str = "Hello";
std::vector<std::string> v;
{// uses the push_back(const T&) overload, which means
// we'll incur the cost of copying str
v.push_back(str);
std::cout << "After copy, str is "" << str << ""n";
//other code involves local variable
}
{// uses the rvalue reference push_back(T&&) overload,
// which means no strings will be copied; instead, the contents
// of str will be moved into the vector. This is less
// expensive, but also means str might now be empty.
v.push_back(std::move(str));
std::cout << "After move, str is "" << str << ""n";
//other code involves local variable
}
std::cout << "The contents of the vector are "" << v[0]
<< "", "" << v[1] << ""n";
}
-s
)来确认这一点,无论是否使用大括号,并比较结果。
恰恰相反:额外的作用域可能会加快速度。(然而,效果很轻微,你不应该麻烦!)
您可以看到,在一个函数中,编译器可以完全控制该函数使用的所有变量。它将而不是在声明它们的堆栈上推送一些额外的变量,并在它们超出范围时将它们弹出。相反,它将创建一个堆栈框架,该框架具有足够的空间来容纳所需的所有局部变量。您的编译器通常足够聪明,可以重用此堆栈帧中的空间:当一个int
在声明另一个int
之前超出作用域时,第二个int
可能会重用堆栈帧中第一个的槽。
因此,当您减少局部变量的作用域时,您允许编译器在堆栈框架中重用更多的槽。这减少了堆栈的总体大小,以及堆栈增长/收缩的距离。这反过来又会带来更好的缓存使用率,从而获得更好的性能。
尽管如此,这种影响的影响很小,所以您通常应该忽略它,只写尽可能可读的代码。
现代编译器足够聪明,在不需要工作的情况下什么都不做。在程序没有利用大括号创建的嵌套作用域的情况下,因为它在该作用域中声明了任何新变量,所以编译器不会插入任何额外的代码来处理新作用域。此外,在嵌套作用域中引入具有平凡析构函数的局部变量不会受到惩罚。通常,添加嵌套范围可能会更改要完成的工作的时间,而总工作量将保持不变。
然而,添加不必要的作用域可能会降低代码的可读性。在这种情况下,可读性是严格主观的,所以如果你喜欢额外的"范围",你可以免费使用它。
用于注释的大括号范围增加了堆栈展开时间
不,它没有。它们影响局部变量的寿命,但不影响它们被破坏的次数。
假设您还有一个std::string
对象要插入到std::vector
中。无论你把它放在main
块中,还是放在额外的大括号块中,它都只会被破坏一次。只有它的一生受到影响。在第一种情况下,它比在第二种情况下更长。
- 为什么在读取文件大小时文件IO速度会发生变化
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- 文件系统:复制功能的速度秘诀是什么
- 学习多线程C++:添加线程不会使执行速度更快,即使它看起来应该
- 在C++中使用并行化的预期速度是多少(不是 OpenMp,而是 <thread>)
- 两个连续的 OpenMP 并行区域会相互减慢速度
- 查找标准::hash_map与标准::矢量的速度
- 加快在C++中读取/处理日志文件的速度
- 为什么这些算法的运行速度比它们应该的要快?
- 如何提高文件的读取速度?
- 通过libpqxx提高PostgreSQL数据库的更新速度
- 使用 IMFSinkWriter 编码的视频的播放速度会根据宽度而变化
- 计算车辆之间的距离并设置速度,使距离保持不变,例如 5 米
- 如何加快大字符串的解析速度?
- 如何比较两个函数的速度和性能
- 线程相互减慢速度
- 多线程减慢程序速度:无错误共享,无互斥锁,无缓存未命中,无小工作量
- 使用 Unity 构建加快C++构建速度,并减少标头依赖项
- 从 OpenCV 3 切换到 OpenCV 4 会导致网络摄像头以最大 5 fps 的速度录制,而不是通常的 30 f
- 如何构建模板的显式实例化以提高编译速度?