C++20語言核心特性的變化

来源:https://www.cnblogs.com/ChebyshevTST/archive/2023/11/30/17868410.html
-Advertisement-
Play Games

C語言分支結構詳解 1. if 語句 在本篇博客文章中,我們將深入探討C語言中的if語句及其相關用法。if語句是一種用於條件判斷的分支語句,它允許我們根據條件的真假來執行不同的代碼塊。 1.1 if 語句的基本語法和用法 if語句的基本語法如下所示: if (條件) { // 條件為真時執行的代碼塊 ...


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 << "open\n";
            break;
        case State::done:
            std::cout << "done\n";
            break;
        case State::progress:
            std::cout << "progress\n";
            break;
        default:
            assert(nullptr);
    }
}
// Since C++20
void print1(State s) {
    using enum State;
    switch (s) {
        case open:
            std::cout << "open\n";
            break;
        case done:
            std::cout << "done\n";
            break;
        case progress:
            std::cout << "progress\n";
            break;
        default:
            assert(nullptr);
    }
}

void print2(State s) {
    using State::open, State::done, State::progress;
    switch (s) {
        case open:
            std::cout << "open\n";
            break;
        case done:
            std::cout << "done\n";
            break;
        case progress:
            std::cout << "progress\n";
            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& 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& as_const(T& 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/else,switch分支當中都可以使用,幫助編譯器作分支預測的優化。

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 World\n"; // OK in C++17, error in C++20
    std::cout << u8"Hello World\n"s; // OK in C++17, error in C++20
    std::cout << u8"Hello World\n"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

  更多的介紹將在下次帶來,感謝支持

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 對象類型通常使用interface聲明,可以設置屬性為可選的或者只讀的,可以設置索引簽名。從簡單類型生成複雜類型可以使用類型繼承或者交集類型。提高類型的泛用性可以使用泛型。 ...
  • TS中的函數需要聲明參數列表和返回值的類型,除此只要,還有關於泛型、可選參數、不定長參數列表、回調函數、this、重載的聲明規則。 ...
  • typora-copy-images-to: media 一、數學處理 1、Math常用API 圓周率 Math.PI // 3.1415926535 生成隨機數 Math.random() 生成的是0~1之間的隨機小數,通常在實際項目中需要獲取到一個範圍內的隨機整數,利用這個隨機小數封裝一個獲取範 ...
  • 公眾號「架構成長指南」,專註於生產實踐、雲原生、分散式系統、大數據技術分享。 概述 隨著科技的進步,軟體系統的部署架構也在不斷演進,從以前傳統的物理機到虛擬機、Docker和Kubernetes,我們經歷了一系列變化。 這些技術的引入給我們帶來了更高的資源利用率、更快的部署速度和更強大的擴展性,下麵 ...
  • C++ 中要在一個函數內返回不同類型的值,你可以使用 C++17 引入的 std::variant 或 std::any,或者使用模板和多態。下麵將分別介紹這些方法。 方法一:使用 std::variant std::variant 允許你在一個函數內返回不同類型的值,但它要求所有可能的返回類型都在 ...
  • 主要探討了SpringMVC中的流程跳轉和不同形式的控制器之間的跳轉方式。首先回顧了JavaWeb中流程跳轉的核心代碼和頁面跳轉方式,並展示了在Web.xml中添加Servlet以及執行這些方式的示例。隨後,介紹了Spring MVC中的四種跳轉形式,包括控制器到JSP頁面的forward和redi... ...
  • 寫在前面 先吐槽兩句,搞個mysql安裝配置弄了4個小時,怎麼都是外網無法訪問,我靠,我特麽也是服了。 當然,後來我投降了,明天再說,學什麼不是學,娘的,換個方向,狀態依然在! Sijax是什麼? 代表 Simple Ajax ,它是一個 Python / jQuery 庫,使用 jQuery.aj ...
  • Sun公司提供了JavaMail用來實現郵件發送,但是配置煩瑣,Spring中提供了JavaMailSender用來簡化郵件配置,Spring Boot則提供了MailSenderAutoConfiguration對郵件的發送做了進一步簡化。 v準備工作 開通POP3/SMTP服務或者IMAP/SM ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...