本文介绍: 空类为了区分不同对象地址字节大小是1;而结构体S由于内存对齐原因,所以字节大小是8。输出结果毫无疑问是1,4,8。nodiscard用于修饰函数,当被修饰函数发生调用(仅仅调用而不作赋值或者强制转换操作),编译器会报警告信息基于范围的for循环是C++11引入的新特性,自C++20起,基于范围循环可以进行初始化特性测试宏,正如其名,是为了当前版本编译器是否支持某个语言特性。这个宏以__cpp前缀。在if/elseswitch分支当中可以使用,帮助编译器作分支预测优化

using for Enumeration Values

  对比一下C++20前后区别

enum class State {
    open,
    progress,
    done = 9
};
// Before C++20
void print(State s) {
    switch (s) {
        case State::open:
            std::cout << "openn";
            break;
        case State::done:
            std::cout << "donen";
            break;
        case State::progress:
            std::cout << "progressn";
            break;
        default:
            assert(nullptr);
    }
}

// Since C++20
void print1(State s) {
    using enum State;
    switch (s) {
        case open:
            std::cout << "openn";
            break;
        case done:
            std::cout << "donen";
            break;
        case progress:
            std::cout << "progressn";
            break;
        default:
            assert(nullptr);
    }
}

void print2(State s) {
    using State::open, State::done, State::progress;
    switch (s) {
        case open:
            std::cout << "openn";
            break;
        case done:
            std::cout << "donen";
            break;
        case progress:
            std::cout << "progressn";
            break;
        default:
            assert(nullptr);
    }
}

Range-Based for Loop with Initialization

  基于范围的for循环是C++11引入的新特性,自C++20起,基于范围循环也可以进行初始化。

int main() {
    std::vector v{1, 2, 3};
    for (int i{1}; const auto&amp; item : v)
        std::cout << std::format("{}: {}n", i++, item);
}

Feature Test Macros

  特性测试宏,正如其名,是为了当前版本编译是否支持某个语言特性。这个宏以__cpp前缀

#if __cpp_generic_lambdas >= 201707
    // generic lambdas with template parameters can be used
#endif

#ifndef __cpp_lib_as_const
template <typename T>
const T&amp; as_const(T&amp; t) {
    return t;
}
#endif

Attribute [[no_unique_address]]

#include <iostream>

struct Empty {};

struct I {
    int i;
};

struct S {
    Empty e;
    int i;
};

int main() {
    std::cout << "sizeof(Empty): " << sizeof(Empty) << 'n';
    std::cout << "sizeof(I): " << sizeof(I) << 'n';
    std::cout << "sizeof(S): " << sizeof(S) << 'n';
}

  空类为了区分不同对象地址字节大小是1;而结构体S由于内存对齐原因,所以字节大小是8。输出结果毫无疑问是1,4,8。

#include <iostream>

struct Empty {};

// EBCO
struct S : Empty {
    int i;
};

// no_unique_address
struct S2 {
    [[no_unique_address]] Empty e;
    int i;
};

int main() {
    std::cout << "sizeof(Empty): " << sizeof(Empty) << 'n';
    std::cout << "sizeof(S): " << sizeof(S) << 'n';
    std::cout << "sizeof(S2): " << sizeof(S2) << 'n';
}

  注解标签no_unique_address能起到和空基类优化相同的效果

Attributes [[likely]] and [[unlikely]]

  在if/elseswitch分支当中都可以使用,帮助编译器作分支预测的优化。

int f(int n) {
    if (n <= 0) [[unlikely]] {
        return n;
    } else {
        return n * n;
    }
}

int g(int n) {
    if (n <= 0) {
        return n;
    } else [[likely]] {
        return n * n;
    }
}

int h(int n) {
    switch (n) {
        case 1:
            //
            break;
        [[likely]] case 2:
            // 
            break;
    }

    return 0;
}

Attribute [[nodiscard]] with Parameter

  nodiscard用于修饰函数,当被修饰函数发生调用(仅仅调用而不作赋值或者强制转换操作),编译器会报警告信息。

[[nodiscard]]
int f(int n) {
    return n;
}

int main() {
    f(1); // Warning
    int n = f(1); // OK
    reinterpret_cast<int *>(f(1)); // OK
}

New Character Type char8_t

using namespace std::literals;

auto c = u8'c'; // char8_t
auto s = u8"Hello World"; // const char8_t *
auto str1 = u8"Hello World"s; // std::u8string
auto str2 = u8"Hello World"sv; // std::u8string_view

std::cout << u8'c' << 'n'; // OK in C++17, error in C++20
std::cout << u8"Hello Worldn"; // OK in C++17, error in C++20
std::cout << u8"Hello Worldn"s; // OK in C++17, error in C++20
std::cout << u8"Hello Worldn"sv; // OK in C++17, error in C++20

std::cout << c << 'n'; // OK in C++17, error in C++20
std::cout << s << 'n'; // OK in C++ 17, error in C++20
std::cout << str1 << 'n'; // OK in C++17, error in C++20
std::cout << str2 << 'n'; // OK in C++17, error in C++20

文章转载自:ChebyshevTST

原文链接https://www.cnblogs.com/ChebyshevTST/p/17868410.html

原文地址:https://blog.csdn.net/sdgfafg_25/article/details/134727240

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_27758.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注