[[likely]]和[[unlikely]]
[[likely]]和[[unlikely]]属性向编译器提示执行路径的可能性,以便它能更好地优化代码。它们可以应用于语句(例如:If /else-statements,循环)或标签(case/default)。
#include <iostream>
#include <string>
#include <stdio.h>
int f(bool b){
if(b) [[likely]] {
return 12;
}
else{
return 10;
}
}
int main()
{
f(true);
return 0;
}
https://wandbox.org/nojs/gcc-head
https://wandbox.org/nojs/clang-head
[[no_unique_address]]
[[no_unique_address]]可以应用于一个非静态的非位域数据成员,以表示它不需要唯一地址。在实践中,它被应用于一个潜在的空数据成员,编译器可以优化它以不占用空间(如空基优化成员)。这样的成员可以共享另一个成员或基类的地址。
#include <iostream>
#include <string>
#include <stdio.h>
struct Empty{};
//C++17
template<typename T>
struct Cpp17Widget{
int i;
T t;
};
//C++20
template<typename T>
struct Cpp20Widget{
int i;
[[no_unique_address]] T t;
};
int main()
{
static_assert(sizeof(Cpp17Widget<Empty>) > sizeof(int));
static_assert(sizeof(Cpp20Widget<Empty>) == sizeof(int));
return 0;
}
[[nodiscard]]
C++17就支持,若从并非转型到 void 的弃值表达式中,调用声明为 nodiscard 的函数,或调用按值返回声明为 nodiscard 的枚举或类的函数,则鼓励编译器发布警告。
C++20中就像[[deprecated("reason")]]一样,nodiscard现在也可以有理由了。
#include <iostream>
#include <string>
#include <stdio.h>
// test whether it's supported
static_assert(__has_cpp_attribute(nodiscard) == 201907L);
[[nodiscard("Don't leave me alone")]]
int get(){};
void f(){
get(); // warning: ignoring return value of function declared with
// 'nodiscard' attribute: Don't leave me alone
}
int main()
{
f();
return 0;
}
这个修复显式地允许对构造函数应用[[nodiscard]](在C++20之前,编译器不需要支持它)。
#include <iostream>
#include <string>
#include <stdio.h>
// test whether it's supported
static_assert(__has_cpp_attribute(nodiscard) == 201907L);
struct resource{
// empty resource, no harm if discarded
resource() = default;
[[nodiscard("don't discard non-empty resource")]]
resource(int fd){};
};
void f(){
resource{}; // OK
resource{1}; // warning
}
int main()
{
f();
return 0;
}
本文暂时没有评论,来添加一个吧(●'◡'●)