C ++中的属性
如果C++中的属性代码在不同的编译器上运行,则属性是现代的标准化方法。属性用于提供一些额外的信息,这些信息用于强制条件(约束),优化并在需要时执行特定的代码生成。
这些就像是供编译器进行一些强制执行的信息手册,这将提高代码的性能。属性最初是在C++11中出现的,此后成为编程语言的重要组成部分。而且,每个版本都不断对其进行一些修订,以使其更加强大和完善。
让我们看看如何在C++中定义属性
对于不同版本的C++,定义属性的语法是不同的。
在c++11中创建属性的语法-
[[attribute-list]]
在c++17中创建属性的语法-
[[using attribute-namespace : attribute_list]]
在c++20中创建属性的语法(即将发布)-
[[contract-attriubute-token contract-level-identifier : expression]]
您可以将许多属性与变量,函数,类一起使用。
现在,由于我们知道什么是属性,它们如何起作用以及如何定义它们。让我们看看c++中可用的不同标准属性。
C++11中引入的属性
noreturn-此属性用于告诉编译器该函数不返回任何值。
语法
[[noreturn]]
示例
[[noreturn]] void f();
此函数将不会返回任何值,甚至不会返回void。
当在c++中使用noreturn属性时,使编译器可以在发生某些错误并且流程不返回到调用代码的情况下返回警告,例如在无限循环或任何错误的情况下。
carry_dependency-用于定义发布使用中的所有依赖关系,并允许编译器通过不执行不必要的内存消耗指令来进行优化。
语法
[[carries_dependency]]
这主要与函数或参数的声明一起使用以声明依赖项。
不推荐使用-用于在代码中定义不推荐使用的实体。允许使用此不赞成使用的实体,但不建议使用它。
语法
[[deprecated]] [[deprecated (reason)]]
原因是一个字符串,它给出了完成折旧的原因,并且还提供了已折旧实体的替代方法。
可以弃用的实体是类,结构,联合,typedef名称,静态成员,函数,命名空间,枚举。
fallthrough-用于向编译器指示从到下一种情况的掉线是故意的,因此,编译器不会警告掉线。
语法
[[fallthrough]]
直通只能与switch一起使用,因为已为其定义了下一种情况。
nodiscard-用于一个将返回枚举的函数,该函数将从舍弃的值表达式中调用,而不是强制转换为void调用。编译器还将为此发出警告。
语法
[[nodiscard]] [[nodiscard (reason)]] (added in C++ 20)
原因是一个字符串,用于提供不丢弃结果的原因,它将包含在c++20中。
might_unused-用于告诉编译器抑制或消除在未使用实体的情况下显示的警告。
语法
[[maybe_unused]]
可以声明maybe_unused的实体为类,结构,联合,typedef名称,静态成员,函数,变量,枚举。
可能,不太可能-这些用于定义天气,替代路径或多或少比当前执行的可能性大。
语法
[[likely]] [[unlikely]]
这些通常应用于更改程序流程(例如标签和语句)的实体。
no_unique_address-用于定义不需要特定地址的数据成员。通常在非静态数据成员不需要定义其内存分配的情况下使用。
语法
[[no_unique_address]]
当编译器需要在普通变量和no_unique_address变量之间分配内存位置时,这将很有用,编译器将优先使用前一个变量。
Optimize_for_synchronized-用于定义必须优化给定函数的定义以便从同步语句调用。
语法
[[optimize_for_synchronized]]
定义为optimize_for_synchronized的函数将避免序列化同步块。
期望-它指定要执行的功能的参数所必须具备的条件。
语法
[[expects : condition]]
条件定义了要执行的功能要满足的条件。
这些都是从C++11到C++20在C++中定义的所有属性。现在,让我们看看为什么在编程中使用这些属性,即建议的属性可以解决什么?
为代码添加约束-在许多情况下,属性为代码添加了含义,并使代码更有效,并减少了额外的工作量。
向编译器提供更多优化信息-一些属性,例如fallthrough,maybe_used,可能会向编译器提供信息以进行特定的优化。
逃避警告和错误-有时程序员的逻辑违背了C++的严格规则。在这种情况下,某些属性将发挥作用,并帮助用户避免或抑制即将发生的警告。