专业的编程技术博客社区

网站首页 > 博客文章 正文

C++20尝鲜:新增属性(c++定义新的数据类型)

baijin 2024-08-13 00:55:43 博客文章 6 ℃ 0 评论

[[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;
}

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表