C ++中的属性。他们真的需要程序员吗?

时间:2017-12-05 14:56:53

标签: c++ c++11

我读到C ++ 11引入了属性的概念,例如[[noreturn]],它表示该函数不会返回给调用者。

[[noreturn]] void fun() 
{
    throw std::string("Error!!!");
}

void func()
{
    fun();
}

void aTempFunc()
{
    try
    {
        func();
    }
    catch (std::string &e)
    {
        std::cout << e << std::endl;
    }
}

通过查看示例,读者可以理解该函数抛出异常并且调用将不会返回到func函数。 我有点困惑,了解什么是C ++属性以及为什么需要它?程序员如何才能真正利用这些属性?

有人可以详细解释。如果我对属性的理解是错误的,请纠正我。 感谢。

2 个答案:

答案 0 :(得分:4)

大多数属性是编译器提示,ABI规范或相对于目标对象格式的要求(可见性,部分等)。

因此,大多数属性都不会更改程序的可观察行为:如果删除源代码的所有属性,并且如果它编译,则可以合理地期望生成的程序表现为用属性编译的那个。

但也有一些属性可以显着影响程序的行为或可编译性,例如align属性,即使它们没有大幅改变代码的语义。

实现可以提供自己的属性,只要程序的可观察行为遵循c ++语言,C++ standard [intro.compliance],这些属性就会产生任何后果:< / p>

  

符合条件的实现可能具有扩展(包括其他库函数),只要它们可用   不要改变任何格式良好的程序的行为。诊断程序需要实现   使用根据本文档格式不正确的扩展。但是,他们这样做了   编译并执行这些程序。

答案 1 :(得分:3)

属性由程序员放置,以获得编译器的好处。基本上,它们为编译器提供了更多信息,并允许更多优化。

例如,noreturn属性允许编译器在调用函数之前回收堆栈内存(因为您不再需要堆栈帧)或者至少将调用后的代码视为死代码。