99久久全国免费观看_国产一区二区三区四区五区VM_久久www人成免费看片中文_国产高清在线a视频大全_深夜福利www_日韩一级成人av

Linux兵工廠
認證:普通會員
所在專題目錄 查看專題
C++必知必會之基礎知識-常用關鍵字(1)
C++必知必會之基礎知識-常用關鍵字(2)
C++必知必會之基礎知識-常用關鍵(3)
C++基礎知識精髓
C++ 關鍵字constexpr
作者動態(tài) 更多
C語言中宏展開規(guī)則,你知多少?
04-22 13:41
DeepSeek對嵌入式軟件行業(yè)的分析
04-18 10:15
openssl:一個開源的安全套接字層加密庫
04-17 09:09
記錄一次RK3399移植GDB16.2
04-16 09:21
std::thread底層實現(xiàn)原理
04-15 14:11

C++必知必會之基礎知識-常用關鍵字(2)

大家好,我是Linux兵工廠,在工作經(jīng)常發(fā)現(xiàn)小伙伴們遇到一些C++的問題都是對基礎知識不熟悉或理解混亂所導致的。正所謂萬丈高樓平地起,作為一名合格的程序員來說,沒有良好的基本功很難達到一定的高度。而工作中大部分編程問題都是基本功不扎實所導致,所以決定花些時間來整理C++相關的基本知識和基本概念供大家參考理解,每一個知識點都結(jié)合相關的代碼進行驗證。本文基本上涵蓋了C++最常用的知識點,希望對小伙伴們有所幫助。
關注公眾號:Linux兵工廠,領取海量Linux免費學習資料,且會不定時輸出更多干貨知識

1. volatile

在C++中,volatile是一個關鍵字,用于修飾變量,告訴編譯器該變量的值可能在程序流程之外被意外修改,因此編譯器不應該對該變量進行優(yōu)化(如緩存變量值或重排指令順序)。
volatile主要用于以下場景:
1、多線程訪問共享變量:在多線程編程中,如果一個變量被多個線程訪問,并且其中一個線程可能會修改該變量的值,就應該使用volatile修飾該變量,以確保線程能夠正確讀取變量的最新值,而不是從緩存中讀取舊值。
2、中斷處理:在嵌入式系統(tǒng)或硬件相關的編程中,中斷處理程序中通常會訪問硬件寄存器或其他與硬件相關的狀態(tài)變量。由于中斷處理程序可能在程序的正常流程之外執(zhí)行,為了確保正確處理這些變量,應使用volatile修飾。
以下是一個簡單的示例,演示了volatile的用法:
#include <iostream>
#include <thread>

volatile int sharedVariable = 0;

void modifySharedVariable() {
    for (int i = 0; i < 5; ++i) {
        sharedVariable = i;
        std::this_thread::sleep_for(std::chrono::milliseconds(100));
    }
}

void readSharedVariable() {
    for (int i = 0; i < 5; ++i) {
        std::cout << "Read sharedVariable: " << sharedVariable << std::endl;
        std::this_thread::sleep_for(std::chrono::milliseconds(200));
    }
}

int main() {
    std::thread writerThread(modifySharedVariable);
    std::thread readerThread(readSharedVariable);

    writerThread.join();
    readerThread.join();

    return 0;
}
在上述示例中,我們使用了volatile修飾sharedVariable變量。modifySharedVariable()函數(shù)在循環(huán)中不斷修改sharedVariable的值,而readSharedVariable()函數(shù)在另一個線程中循環(huán)讀取sharedVariable的值。由于sharedVariable是一個共享變量,在多線程環(huán)境下,為了避免讀取舊值,我們使用volatile修飾,確保readSharedVariable()函數(shù)能夠正確讀取到最新的值。
需要注意的是,volatile修飾符只用于修飾變量,而不是函數(shù)。它不會解決所有多線程問題,更復雜的線程同步問題可能需要使用互斥鎖(std::mutex)或其他同步機制來保證正確性。

2. assert()

在C++中,assert()是一個宏定義,用于在代碼中進行斷言檢查。它是一個調(diào)試工具,用于在程序運行時檢查某個條件是否為真。如果斷言條件為假(即false),則會觸發(fā)斷言失敗,并導致程序中止執(zhí)行。在發(fā)布版本中,默認情況下,斷言會被禁用,因此不會對性能產(chǎn)生影響。
assert()宏的定義位于<cassert>頭文件中,通常在開發(fā)階段使用,以幫助開發(fā)者檢測程序中的錯誤和問題。在調(diào)試階段,當斷言條件為假時,它會輸出錯誤信息,并在終端顯示斷言失敗的位置和原因。
斷言的一般語法如下:
#include <cassert>

int main() {
    int x = 10;
    assert(x == 5); // 斷言條件為假,程序會終止,并顯示錯誤信息
    return 0;
}
在上述代碼中,assert(x == 5)會檢查變量x是否等于5。由于x的值為10,斷言條件為假,程序會終止執(zhí)行,并顯示斷言失敗的信息,如文件名、行號、條件表達式等。
需要注意的是,由于在發(fā)布版本中默認會禁用斷言,因此不應該將assert()用于對用戶輸入進行驗證或執(zhí)行關鍵業(yè)務邏輯。對于這些情況,應該使用更穩(wěn)健的錯誤處理機制。
在開發(fā)過程中,合理使用assert()可以幫助發(fā)現(xiàn)代碼中的問題,提高程序的健壯性和可維護性。但在最終發(fā)布版本中,需要確保去除所有不必要的斷言,以確保代碼的性能和正確性。

3. sizeof()
在C++中,sizeof是一個運算符,用于計算類型或變量的大小(字節(jié)數(shù))。它的語法形式為sizeof (type)sizeof expression
運算符有以下幾個特點和使用場景:
1. 返回值:sizeof運算符返回一個size_t類型的值,表示類型或變量所占用的字節(jié)數(shù)。
2. 對類型的大小計算:對于給定的數(shù)據(jù)類型,sizeof(type)可以計算出該類型的大小。例如:
#include <iostream>

int main() {
    std::cout << "Size of int: " << sizeof(int) << " bytes" << std::endl;
    std::cout << "Size of double: " << sizeof(double) << " bytes" << std::endl;
    return 0;
}
輸出可能為:
Size of int: 4 bytes
Size of double: 8 bytes
  • 對變量的大小計算:sizeof運算符也可以計算變量所占用的字節(jié)數(shù)。例如:
#include <iostream>

int main() {
    int x = 10;
    double y = 3.14;

    std::cout << "Size of x: " << sizeof(x) << " bytes" << std::endl;
    std::cout << "Size of y: " << sizeof(y) << " bytes" << std::endl;
    return 0;
}
輸出可能為:
Size of x: 4 bytes
Size of y: 8 bytes
  • 對數(shù)組的大小計算:對于數(shù)組,sizeof運算符可以計算整個數(shù)組所占用的總字節(jié)數(shù)。例如:
#include <iostream>

int main() {
    int arr[] = {1, 2, 3, 4, 5};
    std::cout << "Size of arr: " << sizeof(arr) << " bytes" << std::endl;
    return 0;
}
輸出可能為:
Size of arr: 20 bytes
  • 對指針的大小計算:`sizeof`運算符計算指針變量本身的大小,而不是指針所指向的對象的大小。無論指針指向的對象類型大小是多少,指針本身的大小都是固定的。
#include <iostream>

int main() {
    int x = 10;
    int* ptr = &x;

    std::cout << "Size of ptr: " << sizeof(ptr) << " bytes" << std::endl;
    return 0;
}
輸出可能為:
Size of ptr: 8 bytes (在 64 位系統(tǒng)上)
請注意,sizeof運算符在編譯時計算,不會真正運行代碼。因此,它在編譯時就能知道類型或變量的大小,并返回一個常量值。
總之,sizeof運算符是一個非常有用的工具,用于在編程中確定數(shù)據(jù)類型和變量的大小,特別是在處理內(nèi)存分配、結(jié)構(gòu)體、數(shù)組等場景中。

4. #pragma pack(n)
在C++中,#pragma pack(n)是一個預處理指令(preprocessor directive),用于告訴編譯器按照指定的字節(jié)對齊方式對結(jié)構(gòu)體或類進行內(nèi)存對齊。通常情況下,編譯器會對結(jié)構(gòu)體或類進行自動的內(nèi)存對齊,以提高訪問效率和性能。
#pragma pack(n)的語法中,n是指定的對齊字節(jié)數(shù),可以是1、2、4、8等,表示結(jié)構(gòu)體或類的成員變量將按照n字節(jié)對齊。在結(jié)構(gòu)體或類定義之前使用該預處理指令,其作用會影響接下來的結(jié)構(gòu)體或類的成員排列。
以下是一個簡單的示例,演示了#pragma pack(n)的用法:
#include <iostream>

// 默認情況下,編譯器會進行自動對齊,對于int類型通常是4字節(jié)對齊
struct MyStructAuto {
    char c;
    int i;
};

// 使用 #pragma pack(1) 指定1字節(jié)對齊,取消自動對齊
#pragma pack(1)
struct MyStructPacked {
    char c;
    int i;
};
#pragma pack()

int main() {
    std::cout << "sizeof(MyStructAuto): " << sizeof(MyStructAuto) << std::endl;
    std::cout << "sizeof(MyStructPacked): " << sizeof(MyStructPacked) << std::endl;
    return 0;
}
輸出可能為:
sizeof(MyStructAuto): 8
sizeof(MyStructPacked): 5
在上述示例中,我們定義了兩個結(jié)構(gòu)體:MyStructAutoMyStructPacked。在MyStructAuto中,編譯器會自動進行對齊,默認情況下,int類型通常是4字節(jié)對齊,因此MyStructAuto的大小是8字節(jié)(1字節(jié)的char加上4字節(jié)的int,再加上3字節(jié)的填充)。
而在MyStructPacked中,我們使用了#pragma pack(1)指定了1字節(jié)對齊,這將取消自動對齊,導致MyStructPacked的大小只有5字節(jié)(1字節(jié)的char加上4字節(jié)的int,沒有填充字節(jié))。
需要注意的是,使用#pragma pack(n)可能會影響內(nèi)存對齊,導致結(jié)構(gòu)體或類的訪問效率降低,尤其是對于大型結(jié)構(gòu)體。在使用#pragma pack(n)時,應謹慎考慮,確保了解其影響,并只在必要時使用。通常情況下,讓編譯器自動進行內(nèi)存對齊是較為推薦的做法。

聲明:本內(nèi)容為作者獨立觀點,不代表電子星球立場。未經(jīng)允許不得轉(zhuǎn)載。授權事宜與稿件投訴,請聯(lián)系:editor@netbroad.com
覺得內(nèi)容不錯的朋友,別忘了一鍵三連哦!
贊 6
收藏 6
關注 37
成為作者 賺取收益
全部留言
0/200
成為第一個和作者交流的人吧
主站蜘蛛池模板: 熟妇人妻无乱码中文字幕 | 精品男人天堂 | 国产精品久久久久久久美男 | 日产特黄极日产 | 国产91视频一区 | 少妇情欲一区二区影视 | 欧美日韩国产高清一区二区三区 | 亚洲高清资源 | 91免费高清观看 | 91大神视频在线免费观看 | 亚洲男人AV免费影院 | 牛和人交videos欧美 | 亚洲爆乳中文字幕无码专区网站 | 国产色噜噜噜91在线精品 | 欧美一性一交一A片费看 | 日日操日日爽 | 久草精品在线观看 | 91无码视频在线观看 | 亚州日本乱码一区二区三区 | 日韩AV东京社区男人的天堂 | 日本在线观看网址 | 国语对白一区二区三区 | 国产真实乱偷精品视频免 | 四虎首页 | 成人性生交大片100部 | 国四虎影永久去哪里了 | 国产伦精品一区二区三区四区视频 | 久久不卡一区 | 二区在线观看 | 欧美变态口味重另类在线视频 | 3344成人免费高清免费视频 | 久久在现视频 | 亚洲精品久久久久久久久久 | 看真人视频一级毛片 | 国产美女91视频 | 人人天天操 | 黑人巨大精品欧美一区二区一 | 精品剧情V国产在线观看 | 中文字幕免费亚洲 | www.久久| 久久久亚洲精品中文字幕 |