大括号的作用域是否用于注释目的,从而降低C++代码的速度

Does curly brace scope for comment purpose slow down C++ code?

本文关键字:C++ 速度 代码 作用域 是否 注释 用于      更新时间:2023-10-16

用于澄清代码边界的大括号作用域是否会增加代码执行时间?在我看来,确实如此。因为在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";
}

退出一个作用域会破坏该作用域中声明的所有局部变量(最年轻的先声明)。在您的示例中,作用域中没有声明本地变量,因此不应该有开销。在这种情况下,您可以通过编译到汇编语言(gcc下的-s)来确认这一点,无论是否使用大括号,并比较结果。

恰恰相反:额外的作用域可能会加快速度。(然而,效果很轻微,你不应该麻烦!)

您可以看到,在一个函数中,编译器可以完全控制该函数使用的所有变量。它将而不是在声明它们的堆栈上推送一些额外的变量,并在它们超出范围时将它们弹出。相反,它将创建一个堆栈框架,该框架具有足够的空间来容纳所需的所有局部变量。您的编译器通常足够聪明,可以重用此堆栈帧中的空间:当一个int在声明另一个int之前超出作用域时,第二个int可能会重用堆栈帧中第一个的槽。

因此,当您减少局部变量的作用域时,您允许编译器在堆栈框架中重用更多的槽。这减少了堆栈的总体大小,以及堆栈增长/收缩的距离。这反过来又会带来更好的缓存使用率,从而获得更好的性能。

尽管如此,这种影响的影响很小,所以您通常应该忽略它,只写尽可能可读的代码。

现代编译器足够聪明,在不需要工作的情况下什么都不做。在程序没有利用大括号创建的嵌套作用域的情况下,因为它在该作用域中声明了任何新变量,所以编译器不会插入任何额外的代码来处理新作用域。此外,在嵌套作用域中引入具有平凡析构函数的局部变量不会受到惩罚。通常,添加嵌套范围可能会更改要完成的工作的时间,而总工作量将保持不变。

然而,添加不必要的作用域可能会降低代码的可读性。在这种情况下,可读性是严格主观的,所以如果你喜欢额外的"范围",你可以免费使用它。

用于注释的大括号范围增加了堆栈展开时间

不,它没有。它们影响局部变量的寿命,但不影响它们被破坏的次数。

假设您还有一个std::string对象要插入到std::vector中。无论你把它放在main块中,还是放在额外的大括号块中,它都只会被破坏一次。只有它的一生受到影响。在第一种情况下,它比在第二种情况下更长。