女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

從C++11升級至C++17,它們讓嵌入式系統(tǒng)更好了!

技術(shù)讓夢想更偉大 ? 來源:CSDN ? 2023-06-13 14:34 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

關(guān)注、星標(biāo)公眾號,直達(dá)精彩內(nèi)容54f07d9e-099b-11ee-962d-dac502259ad0.png

		

2011 年8 月,ISO 委員會發(fā)布了 C++11,2017 年 12 月又發(fā)布了 C++17 標(biāo)準(zhǔn),每次編程語言新版本的迭代,會令不少團(tuán)隊也開始著手升級開發(fā)環(huán)境,例如本文作者。那么從 C++11 升級到 C++17,究竟有哪些特別的變化值得關(guān)注?

最近,我們團(tuán)隊正在升級開發(fā)環(huán)境,嘗試使用許多工具和編程語言的新版本。在這個過程中,比較困難的一項工作是將我們的嵌入式應(yīng)用程序的代碼庫從 C++11 升級到 C++17。

在本文中,我將展示在嵌入式世界中非常有用的一些C++17 的特性(注意:從 C++11 遷移到 C++17 也涵蓋了 C++14,因此我也會提到 C++14 的一些特性)

看完整的C++17性列表,可前往:https://github.com/AnthonyCalandra/modern-cpp-features#c17-language-features。

C++14 的主要變化

當(dāng)初,我們從 C++03 遷移到了 C++11,與之相比,從 C++11 升級到 C++14 時看到的升級比較小。因此,可以在嵌入式系統(tǒng)中使用的 C++14 特有功能實際上并不多。

二進(jìn)制字面量

如果你經(jīng)常需要執(zhí)行按位運算或修改寄存器,那么一定很喜歡這些字面量。一些編譯器具有支持此類字面量的擴(kuò)展,這些字面量在實際的標(biāo)準(zhǔn)中也有一席之地。

uint8_t a = 0b110; // == 6
uint8_t b = 0b1111'1111; // == 255

constexpr**

在 C++14 中,可以在 constexpr 函數(shù)中使用的語法得到了擴(kuò)展。constexpr 特別適用于嵌入式開發(fā),因為它可以在編譯時進(jìn)行計算并將一些代碼簡化為常量。請注意,只有當(dāng)表達(dá)式的所有需求都可以在編譯期間確定時,才能在編譯時計算表達(dá)式。

constexpr int factorial(int n) {
if (n <= 1) {
return 1;
} else {
return n * factorial(n - 1);
}
}
factorial(5); // == 120 (Calculated at compile time)

C++ 17 的世界

與 C++14 相比,C++17 標(biāo)準(zhǔn)有了很大的變化,但無需擔(dān)心,你仍然可以使用已有的功能。除了已有功能之外,你還將擁有更強(qiáng)大的 C++17 語法和庫。

(1)屬性

首先,我們來介紹三個新屬性:[[fallthrough]]、[[nodiscard]] 和 [[maybe_unused]]。因為這些屬性只在編譯時考慮,所以你根本不需要擔(dān)心它們的效率。它們的存在就是為了提升代碼開發(fā)。

[[fallthrough]]

你可以利用這個屬性將兩個相鄰的 case 分支的主體合并到一個 switch 中,而不會收到來自編譯器的任何警告。你可以通過這個屬性告訴編譯器前一個case主體結(jié)束是有意為之。

switch (n) {
case 1: [[fallthrough]]
// ...
// no `break;`
case 2:
// ...
break;
}

[[nodiscard]]

你是不是也經(jīng)常忘記檢查函數(shù)的返回值?有了這個屬性,丟棄返回值就會收到編譯器的警告。

[[nodiscard]] bool do_something() {
return is_success; // true for success, false for failure
}
do_something(); /* warning: ignoring the return value of function declared with attribute 'nodiscard' */

[maybe_unused]]

為了避免收到警告,必須將未使用的變量轉(zhuǎn)換為 void,你是不是也感到不耐煩?試試看這個屬性,你就可以擺脫那些煩人的警告。

void my_callback(std::string msg, [[maybe_unused]] bool error) {
// Don't care if `msg` is an error message, just log it.
log(msg);
}

(2)編譯時的力量

編譯時的檢查是我最喜歡 C++ 的地方。在 C++17 中,這種能力通過一些新特性得到進(jìn)一步增強(qiáng)。想一想許多嵌入式系統(tǒng)中繁瑣的調(diào)試過程,如今甚至不需要部署代碼就可以檢查結(jié)果,是不是覺得是個特大好消息?傳輸可執(zhí)行文件、準(zhǔn)備環(huán)境和測試等一系列工作都非常艱巨,而且很耗時。但使用編譯時編程,這部分頭疼的工作都可以省略。

沒有消息的靜態(tài)斷言

你可能認(rèn)為,我們已經(jīng)有了 static_assert(..),可以在編譯時進(jìn)行檢查。而如今,斷言機(jī)制甚至不需要錯誤消息。這樣,代碼看上去會更加清晰。

static_assert(false);

if constexpr

我最喜歡的一個語句!我們可以利用 if constexpr 編寫一些代碼,這些代碼可以根據(jù)編譯時的條件,有選擇地進(jìn)行實例化。

template<typename T>
auto length(const T& value) noexcept {
if constexpr (std::integral::value) { // is number
return value;
}
else {
return value.length();
}
}
int main() noexcept {
int a = 5;
std::string b = "foo";
std::cout << length(a) << ' ' << length(b) << '
'; // Prints "5 3"
}

在 C++17 之前,上面這段代碼需要編寫兩個不同的函數(shù),分別用于字符串和整數(shù)輸入,如下所示。

int length(const int& value) noexcept {
return value;
}
std::size_t length(const std::string& value) noexcept {
return value.length();

constexpr lambda

如果你也喜歡在代碼中使用 lambda 表達(dá)式,那么肯定會喜歡這個功能。此外,Lambdas 的調(diào)用也可以采用直接聲明為 constexpr 的形式。

auto identity = [](int n) constexpr { return n; };
static_assert(identity(123) == 123);

(3)語法糖

在 C++17 中,有一些功能可以幫助你編寫更漂亮的代碼。即使它們的存在對運行時性能沒有明顯的影響,但你會很喜歡它們。

折疊表達(dá)式

如果你有過使用可變參數(shù)模板來編寫具有可變輸入或迭代次數(shù)的遞歸算法的經(jīng)歷,那么就可能遇到必須為該可變參數(shù)模板函數(shù)實現(xiàn)終止符的問題。例如,下面的代碼是用 C++11 編寫的,作用是累加給定的數(shù)字。

int sum() { return 0; } // Termination function
template<typename ...Args>
int sum(const int& arg, Args... args) {
return arg + sum(args...);
}

如果我們沒有實現(xiàn)不接受任何輸入的終止符,這段代碼將無法通過編譯。但有了折疊表達(dá)式,你就不必實現(xiàn)終止符了,而代碼看上去也更好,如下所示。

template<typename ...Args>
int sum(Args&&... args) {
return (args + ...);
}

嵌套命名空間

不知道為什么 C++ 委員會以前沒有想到這一點。無需多說,分別看下面 C++11 和 C++17 中嵌套命名空間的定義,你就能發(fā)現(xiàn)區(qū)別。

// C++11
namespace A {
namespace B {
namespace C {
int i;
}
}
}
// C++17
namespace A::B::C {
int i;
}

加強(qiáng)版的條件語句

如果所有條件語句都像 for 語句一樣具有初始化,那是不是更強(qiáng)大?在 C++17 中,條件語句也增加了初始化部分。

這是迄今為止我所見過的最強(qiáng)大的功能之一,因為你無需在輸入一系列 if-else 語句或 switch-case 之前,編寫一堆局部變量。

if (int i = 4; i % 2 == 0) {
cout << i << " is even number" << endl;
}
switch (int i = rand() % 100; i) {
default:
cout << "i = " << i << endl;
break;
}

內(nèi)聯(lián)變量

在 C++17 之前,我們必須在源文件中實例化類內(nèi)靜態(tài)變量。如今,你可以使用內(nèi)聯(lián)變量將聲明和初始賦值合并到類定義中,如下所示。

struct BabaMrb {
static const int value = 10;
static inline std::string className = "Hello Class";
}

(4)其他特性

C++17 中還有許多我不知道如何歸類的的其他特性。下面,我們來逐一介紹。

復(fù)制省略

復(fù)制省略(Copy elision),即返回值優(yōu)化,是大多數(shù)編譯器為防止在某些情況下出現(xiàn)額外副本而實現(xiàn)的優(yōu)化。從 C++17 開始,直接返回對象時必然會觸發(fā)復(fù)制省略。在某些情況下,即使只有一次復(fù)制操作也會影響系統(tǒng)的性能,例如對實時性有嚴(yán)格要求的系統(tǒng)。遇到這種情況,我們最好確保避免復(fù)制,以免降低系統(tǒng)性能。

struct C {
C() { std::cout << "Default constructor" << std::endl; }
C(const C&) { std::cout << "Copy constructor" << std::endl; }
};
C f() {
return C();  // Definitely performs copy elision
}
C g() {
C c;
return c;    // May perform copy elision
}
int main() {
C obj = f(); // Copy constructor isn't called
}

共享互斥鎖

在使用共享互斥鎖后,我們就可以按需讀取對象而無需加鎖,而寫調(diào)用可以照往常一樣使用常規(guī)互斥鎖來鎖定對象。共享互斥鎖可以加快只讀訪問操作的速度,因為讀取操作可以同步進(jìn)行。

硬件干涉大小

這個新的庫功能可以幫助你在編譯期間確定 L1 緩存行的大小。有了這個功能,你就可以根據(jù) L1 緩存行的大小調(diào)整結(jié)構(gòu)、緩沖區(qū)等。我在使用 C++11 為 ARM Cortex-A9 內(nèi)核實現(xiàn)低級裸機(jī) DMA 驅(qū)動程序時就會用到這個功能,因為在編寫這些代碼時,我需要手動管理高速緩存和主內(nèi)存之間的一致性。

盡管此功能非常強(qiáng)大,但直到版本 12 才在所有版本的 GCC 中實現(xiàn),因此很可能你當(dāng)前的編譯器并不支持。如下代碼是一個示例,可以幫助你更好地理解這個功能。

#ifdef __cpp_lib_hardware_interference_size // Undefined prior to C++17
using std::hardware_constructive_interference_size;
using std::hardware_destructive_interference_size;
#else
// 64 bytes on x86-64 │ L1_CACHE_BYTES │ L1_CACHE_SHIFT │ __cacheline_aligned │ ...
constexpr std::size_t hardware_constructive_interference_size   = 64;
constexpr std::size_t hardware_destructive_interference_size    = 64;
#endif
struct alignas(hardware_constructive_interference_size) OneCacheLiner { // occupies one cache line
std::atomic_uint64_t x{};
std::atomic_uint64_t y{};
};

總結(jié)

與 C++14 不同,C++17 引入了許多新特性。其中一些功能對嵌入式系統(tǒng)開發(fā)非常有幫助。

不同產(chǎn)品之間,嵌入式設(shè)備的計算能力差異很大。由于 CPU 性能、缺乏編譯器支持、驗證必要性等多種原因,我選擇的某些功能可能不適用于你的固件。總體而言,遷移到 C++17 可能需要花費大量的時間和精力,請認(rèn)真考慮是否需要遷移。


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 嵌入式系統(tǒng)
    +關(guān)注

    關(guān)注

    41

    文章

    3682

    瀏覽量

    131365
  • C++
    C++
    +關(guān)注

    關(guān)注

    22

    文章

    2119

    瀏覽量

    75278
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1662

    瀏覽量

    50205

原文標(biāo)題:從 C++11 升級至 C++17,它們讓嵌入式系統(tǒng)更好了!

文章出處:【微信號:技術(shù)讓夢想更偉大,微信公眾號:技術(shù)讓夢想更偉大】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    使用C++11新特性實現(xiàn)一個通用的線程池設(shè)計

    C++11標(biāo)準(zhǔn)之前,多線程編程只能使用pthread_xxx開頭的一組POSIX標(biāo)準(zhǔn)的接口。C++11標(biāo)準(zhǔn)開始,多線程相關(guān)接口封裝在了C++的std命名空間里。
    的頭像 發(fā)表于 12-22 13:58 ?1985次閱讀
    使用<b class='flag-5'>C++11</b>新特性實現(xiàn)一個通用的線程池設(shè)計

    嵌入式C++編程的相關(guān)資料分享

    特點展示如何使用 C ++ 來構(gòu)建利用可用硬件資源的強(qiáng)大并發(fā)系統(tǒng)嵌入式編程入門和 C ++ 17
    發(fā)表于 11-09 08:26

    嵌入式系統(tǒng)中的Python與C / C ++的相關(guān)資料分享

    嵌入式python c++ 盡管C / C ++編程語言有很多缺點,但它們嵌入式
    發(fā)表于 12-15 07:14

    嵌入式系統(tǒng)C程序設(shè)計

    嵌入式系統(tǒng)C程序設(shè)計
    發(fā)表于 04-07 22:42 ?86次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>系統(tǒng)</b>的<b class='flag-5'>C</b>程序設(shè)計

    由DP83846升級DP83848C/I/YB PHYTE

    由DP83846升級DP83848C/I/YB PHYTER系統(tǒng)的滾動支持文件
    發(fā)表于 02-14 17:29 ?45次下載

    嵌入式系統(tǒng)c程序設(shè)計

    嵌入式系統(tǒng)c程序設(shè)計
    發(fā)表于 02-11 09:21 ?65次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>系統(tǒng)</b>的<b class='flag-5'>c</b>程序設(shè)計

    嵌入式C編程

    嵌入式C編程,非常有用的資料,介紹嵌入式C語言編程
    發(fā)表于 12-29 17:29 ?0次下載

    C嵌入式系統(tǒng)編程

    C嵌入式系統(tǒng)編程
    發(fā)表于 10-23 16:27 ?14次下載

    嵌入式系統(tǒng)C程序設(shè)計

    嵌入式系統(tǒng)C程序設(shè)計
    發(fā)表于 10-30 10:20 ?13次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>系統(tǒng)</b>與<b class='flag-5'>C</b>程序設(shè)計

    《深入理解C++11C++11新特性解析與應(yīng)用的詳細(xì)電子教材免費下載

    國內(nèi)首本全面深入解讀 C++11 新標(biāo)準(zhǔn)的專著,由 C++ 標(biāo)準(zhǔn)委員會代表和 IBM XL 編譯器中國開發(fā)團(tuán)隊共同撰寫。不僅詳細(xì)闡述了 C++11 標(biāo)準(zhǔn)的設(shè)計原則,而且系統(tǒng)地講解了
    發(fā)表于 08-27 08:00 ?0次下載

    C++17 STL標(biāo)準(zhǔn)庫學(xué)習(xí)教材電子書免費下載

    C++11C++14和C++17標(biāo)準(zhǔn)為C++添加了許多新特性。當(dāng)前的C++已經(jīng)和10年前的C+
    發(fā)表于 02-28 08:00 ?9次下載
    <b class='flag-5'>C++17</b> STL標(biāo)準(zhǔn)庫學(xué)習(xí)教材電子書免費下載

    嵌入式C++編程

    特點展示如何使用 C ++ 來構(gòu)建利用可用硬件資源的強(qiáng)大并發(fā)系統(tǒng)嵌入式編程入門和 C ++ 17
    發(fā)表于 11-04 10:36 ?10次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>C</b>++編程

    c++入門后如何進(jìn)階

    C++11 是下一個 C++ 標(biāo)準(zhǔn),但我們通常稱之為現(xiàn)代 C++。現(xiàn)代 C++ 也包括了 C++14 和
    發(fā)表于 07-21 08:56 ?520次閱讀
    <b class='flag-5'>c</b>++入門后如何進(jìn)階

    C++98到C++26,經(jīng)歷了什么?

    上個月,C++26時間表發(fā)布,將會在“并發(fā)和并行性方面有重大改進(jìn)”。而已經(jīng)推出的C++ 23版本則沿襲了C++17的傳統(tǒng)特征,完善了現(xiàn)有特性。但是,與C++ 98、
    的頭像 發(fā)表于 08-09 16:01 ?1521次閱讀
    <b class='flag-5'>從</b><b class='flag-5'>C</b>++98到<b class='flag-5'>C</b>++26,經(jīng)歷了什么?

    JDK11升級JDK17最全實踐

    2021年9月14日,Oracle發(fā)布了可以長期支持的JDK17版本,那么JDK11到JDK17,到底帶來了哪些特性呢?亞毫秒的ZGC效
    的頭像 發(fā)表于 11-17 10:36 ?2038次閱讀
    JDK<b class='flag-5'>11</b><b class='flag-5'>升級</b>JDK<b class='flag-5'>17</b>最全實踐