嵌入式開發學習 C++:day01

C++概述

C++誕生

1972年前后,計算機先驅丹尼斯·里奇開始設計C語言并用它來重寫Unix系統,里奇的這個決定催生了計算機領域最石破天驚的兩門重炮:Unix和C,這兩者都是IT產業中鼻祖級的存在,Unix是現代蘋果系統和Linux系統的最初來源,而C則是現代眾多編程語言的思想源泉。后來隨著IT產業的發展,C語言加入了諸如面向對象、泛型編程等新特性,在1983年前后,貝爾實驗室的Biarne Strau-strup(本賈尼·斯特勞斯特盧普)推出了現代編程界中威力最猛的一門重炮:C++。

c++之父「Bjarne Strou-strup」
c++之父「Bjarne Strou-strup」

C++進一步擴充和完善C語言,成為一種多種編程范式的程序設計語言。從其名稱可以推斷,這種編程語言與C語言有密切的聯系,實際上它們通常被合稱為C/C++,它們的關系主要體現在以下兩點:

  • C++是C語言的超集, C語言是C++語言聯邦的一部分。
  • C++完全兼容C語言,并提供眾多火力強大的現代編程范式

在這里插入圖片描述

C與C++

據統計,當今世界上不同的編程語言有幾百種之多, C++是使用最廣泛的編程語言之一,是名副其實的頂流。 C++強大的同時,也是一門比較復雜的語言,它還包括函數式編程、泛型編程等不同的編程范式,有人說C++不是一門編程語言,而是眾多編程語言的合集。

C++能干什么

C++主要用在開發系統、算法核心、游戲引擎等對性能高度敏感的領域,除了性能出眾, C++的高安全性也是首屈一指的。下面簡單羅列C++在IT各開發領域所展露的強大生
命力。

游戲 C++非常適合開發游戲,它的超前設計在應對3D游戲的復雜性時游刃有余, C++對網絡的良好支持使得開發大型多人同時在線游戲成為可能,更進一步,由于C++允許直接控制硬件,因此能極大釋放CPU的潛能,這種高性能使得C++被廣泛應用于不同的游戲和游戲引擎。

在這里插入圖片描述

動畫 許多動畫軟件都是用C++開發的, C++非常適合用于圖像處理、視覺效果呈現等典型的資源消耗型軟件,比如:三維動畫、建模、仿真、渲染,尤其是虛擬現實VR的場景和角色創建。

在這里插入圖片描述

瀏覽器 C++也適合于用來開發瀏覽器,比如微軟著名瀏覽器IE,谷歌的 Chrome Fire Fox 等,都是C++編寫的, C++還是谷歌和Mozilla開源項目的核心呈現引擎的編程語
言。

在這里插入圖片描述

數據庫 C++在數據庫軟件開發中也占據非常重要的地位,最流行的數據庫管理軟件 MySQ L 就是其中一例, C++有助于節省時間、成本,提高業務系統的開發效率,還有大量基于
數據庫軟件訪問的應用程序,主要都使用C++開發,這使得數據庫訪問快速、準確。

在這里插入圖片描述

多媒體 C++當然可以用于創建媒體播放器,管理音視頻文件等,它使得我們享受音樂,訪
問和分享視頻和音樂文件。相關的C++類庫還具有藝術支持、音頻和視頻流媒體等功能。
甚至提供互聯網無線電臺的接入。

在這里插入圖片描述

編譯系統 大多數的編譯器都使用C++開發,編譯器是一種將計算機語言翻譯成機器指令的特殊軟件,比如C#、 Java等語言的編譯器都是由C++進行翻譯,然后才能交給CPU去運行。 C++在底層層面為各種各樣軟件的移植性提供支持。

? 從這方面理解, C和C++是編寫其他語言的語言,是許多編程語言的母語言。

操作系統 開發編譯系統和操作系統,從某種程度上講是C/C++當初被設計出來的初衷,如今世界上通行的底層操作系統幾乎全部都是C/C++開發的,比如微軟的 Windows2000 XP Unix/Linux 系統,安卓系統和蘋果公司的部分操作系統。

在這里插入圖片描述

應用開發 圖形應用軟件領域也大量廣泛使用C++開發,比如被著名的圖形設計軟件 Phot oShop Adobe系列軟件,微軟的 Office 辦公套件和Visual Studio,還有大量應
用于人工智能領域的算法引擎。

小結

? 由于出生年代較早, C/C++并不是最易用、語法結構最淺顯的語言,這主要是因為早期的計算機資源有限,計算機科學家在開發C/C++的時候,最在意的是最終代碼運行的效率,而遠非代碼編寫的難易度,這導致C/C++可以支持非常貼近底層硬件細節的語法,抓地力非常強,因而學習曲線要比一般的編程語言陡峭,也就是對學習者的要求更高。

? 但也正是因為以上原因, C/C++天生具有高性能的血統,在目前的IT產業中,凡是涉及底層系統、算法核心、游戲引擎等對性能敏感的領域, C/C++都扮演者著不可或缺的角色,因為這些部件哪怕1%的性能波動,都會對整個軟件的體驗帶來本質的改變。 總體來講, C/C++是一門難學易用的編程語言,是計算機編程領域的重裝武器,一旦掌握,威力無比。

C++輸入輸出

概述

在C++ 中輸入和輸出操作可以通過標準庫中的iostream頭文件來實現。這個頭文件提供了類和對象,用于處理輸入流(istream)和輸出流(ostream)。最常見的來個對象是cin(控制臺輸入)和cout (控制臺輸出)。

包含頭文件

為了使用輸入輸出功能必須包含以下頭文件#include <iostream>

輸出到控制臺

使用cout 對象可以將數據輸出到控制臺。<<運輸符 (用于將數據插入到輸出流中)。

cout相當于一個面向對象的結構體)

typedef struct 
{int id;char *name;
}Student;
Student stu;// stu是學生對象
//stu.id 和  stu.name 是對象的成員
基本用法
// 如果不想寫std :: 可以在文件頂部添加聲明,using namespace std;
std ::cout << "hello World";// 開口方向是數據流方向
// 類似于C語言中的 printf("hello world \n");
輸出多個值
int number = 10;
std:: count << "number" <<"number"; // 輸出:number :10

從控制臺輸入

使用cin對象可以從控制臺讀取用戶輸入。>> 運輸符(用于從輸入流中讀取數據)

基本用法
int age;
std::cout << "請輸入您的年齡";
std::cin >> "age";
std::cout << "您今年" << "age" << " 歲 " << " \n ";

處理字符串輸入

對于字符串類型,建議使用getline函數,因為他可以讀取包含空格的整行文本。

#include <string>std::string name ;// 字符串類型的變量
std::cout << "請輸入您的名字";
std::getline(std::cin,name); // 相當于C語言中的scanf("%s",&name)
std::cout << "你好", << "name" << "!\n";

格式化輸出

可以使用操縱器來格式化輸出,例如設置數字的顯示方式、填充字符等。

設置精度
double pi = 3.1415926;
std:: cout.self(std:: ios::fixed);// 固定小數點表示法
std:: cout.precision(2); // 和上面代碼配套使用,設置小數保留為2
std:: cout<< "PI 的近似值:" << pi << "\n" ;// 輸出結果,PI 的近似值:3.14
對齊方式
//c++ 標準庫中的一個頭文件, 提供了多種用于控制輸入輸出格式的操縱器( manipulators) , 通過使用`<iomanip>`, 可以方便的格式化輸入輸出數據, 例如試著小數位數、 對齊方式、 填充字符等。
#include <iomanip>int num = 42;
std::cout.width(10); // 設置字段寬度為10, 也就是c語言的%m
std::cout.fill("*"); // 填充字符為*
std::cout << std:: left << num << "\n"; // 左對齊輸出, 輸出結果:
std::cout << std:: right << num << "\n"; // 右對齊輸出, 輸出結果:

完整的代碼

/*************************************************************************> File Name:    demo01.cpp> Author:       小劉> Description:  控制臺的輸入輸出> Created Time: 2025-08-18 10:46:58************************************************************************/
#include <iostream>
#include <iomanip>
#include <string>// 聲明使用命名空間
using namespace std;int main()
{// 聲明一個字符串的變量string name;int age;cout << "請輸入您的名字:";getline(cin,name);cout << "請輸入您的年齡:";cin >> age ;double height ;cout << "請輸入您的身高(米)";cin >> height;cout << " 個人信息 :" << endl; // cout << " 姓名 :    " << name << " \n";cout << " 年齡 :    " << age  << endl;cout.setf(ios :: fixed);cout.precision(2);cout << " 身高:     " << height << endl;return 0;	
}

內存分區模型

C++ 程序執行時,將內存大方向劃分為4個區域

  • 代碼區:存放函數體的二進制代碼,由操作系統進行管理

  • 全局區:存放全局變量和靜態變量以及常量

  • 堆區:由編譯器自動分配釋放,存放函數的形參值,局部變量等。

  • 棧區:由程序員分配和釋放,若程序員不釋放,程序結束時由操作系統回收。

    在這里插入圖片描述

內存四區意義:

不同區域存放的數據,賦予不同的生命周期給我們大量的靈活編程。

程序運行前

在程序編譯后,生成了exe可執行程序,未執行該程序前分為兩個區域

代碼區:

? 存放CPU執行的機器指令

? 代碼區是共享的,共享的目的是對于頻繁被執行的程序,只需要在內存中有一份代碼即可

? 代碼區是只讀的,使其只讀的原因是防止程序意外地修改了它的指令

全局區:

? 全局變量和靜態變量存放在此

? 全局區還包含了常量區,字符串常量和其他常量也存放在此

? 該區域的數據在程序結束后由操作系統釋放

案例:

/*************************************************************************> File Name:    demo03.cpp> Author:       小劉> Description:  內存分區模型> Created Time: 2025-08-18 14:39:47************************************************************************/
#include <iostream>
#include <iomanip>// 使用std命名空間
using namespace std;// 全局變量:定義在函數外部,默認有初始值是0 \0 NULL
int g_a = 10;
int g_b = 10;// 全局常量:只能賦值一次,一般通過初始值賦值
const int c_g_a = 10;
const int c_g_b = 10;int main()
{// 局部常量:寫在函數或者語句塊的常量int a = 10;int b = 10;// 打印局部變量地址cout <<  "局部變量a 的地址:" << &a << endl;cout <<  "局部變量b 的地址:" << &b << endl;// 打印全局變量地址cout <<  "全局變量g_a 的地址:" << &g_a << endl;cout <<  "全局變量g_b 的地址:" << &g_b << endl;// 靜態變量 存儲在數據區static int s_a = 10;static int s_b = 10;// 打印靜態變量地址cout <<  "靜態變量s_a 的地址:" << &s_a << endl;cout <<  "靜態變量s_b 的地址:" << &s_b << endl;cout <<  "全局常量c_g_a 的地址:" << &c_g_a << endl;cout <<  "全局常量c_g_b 的地址:" << &c_g_b << endl;cout <<  "字符串常量的地址:" << &"hello world" << endl;cout <<  "字符串常量的地址:" << &"hello world1" << endl;// 只讀常量 | 局部常量const int c_l_a = 10;const int c_l_b = 10;cout <<  "局部常量c_l_a 的地址" << &c_l_a <<endl;cout <<  "局部常量c_l_b 的地址" << &c_l_b <<endl;return 0;
}

在這里插入圖片描述

總結

  • C ++中在程序運行前分為全局區和代碼區
  • 代碼區特點是共享和只讀
  • 全局區中存放全局變量、靜態變量、常量
  • 常量區中存放const修飾的全局常量和字符串常量

程序執行后

棧區:

? 由編譯器自動分配釋放,存放函數的參數值,局部變量等

? 注意事項:不要返回局部變量的地址,棧區開辟的空間由編譯器釋放

示例:

int* func()
{int a = 10;return &a; // 返回a 的地址
}int main()
{int *p = func();cout << *p << endl; // 此時p是有值的,存放的就是func中a的地址,但是由于func整體的內存回收所以導致p地址對應的空間不存在,此時這種現象就屬于懸掛指針(空懸指針),它是野指針的一種體現。//ststem("pause");return 0;
}

堆區:

? 由程序員分配釋放,若程序員不釋放,程序結束后由操作系統回收。

? 在C++主要利用new在堆區開辟內存。

int func()
{int *a = new int(10); // 等價于 int* a = malloc(sizeof(int));return 0;
}int main()
{int *p = func();cout << *p << endl;return 0;
}

總結:

堆區數據由程序員管理開辟和釋放

堆區數據利用new關鍵字進行開辟內存,利用delete關鍵字釋放內存

new操作符

C++中利用new 操作符在堆區開辟內存。

堆區開辟的內存,由程序員手動開辟,手動釋放,釋放利用操作符delete

語法:

new 數據類型;
delete 變量;

利用new創建的內存,會返回內存空間的指針。

示例1基本語法

/*************************************************************************> File Name:    demo03.cpp> Author:       小劉> Description:  new 操作符> Created Time: 2025-08-18 15:39:41************************************************************************/
#include <iostream>
#include <iomanip>using namespace std;int* func()
{int *a = new int(10); // 在堆區內存申請4字節的空間,存放一個初始數據10return a;
}
int main()
{int *p = func();cout << *p << endl; //10// 利用delete釋放堆區數據delete p ;cout << *p << endl;// 報錯,釋放的空間不可訪問return 0;
}

示例2:開辟數據組

/*************************************************************************> File Name:    demo04.cpp> Author:       小劉> Description:  new操作符,開辟數組> Created Time: 2025-08-18 15:45:51************************************************************************/
#include <iostream>
#include <iomanip>using namespace std;int main()
{int * arr = new int [10];// int(10) 初始化數據位10 ,int[10] 指定數組大小for(int i=0;i<10;i++){arr[i] = i + 100;}for(int i=0;i<10;i++){cout << arr[i] << endl;}delete[] arr;return 0;
}
面試題:new與 malloc的區別?
  1. 聯系:

    1.1 new和malloc都可以用來申請堆內存,new運算符內部實現仍然調用了malloc,

    1.2 new和malloc作用于基礎數據類型,兩者沒有區別;

  2. 區別:

    2.1 性質上:new是運算符,malloc是函數

    2.2內存申請上,malloc是要指明申請的內存大小,new會根據目標類型申請內存;

    2.3返回數據類型,malloc只返回void*,new會返回目標類型的指針;

    2.4從底層實現原理上,malloc只負責空間申請,new不僅要空間申請,還要負責對象構造。

    涉及術語:自由存儲區自由存儲區:用new運算符申請的內存成為自由存儲區C++標準庫提供的new運算符內部調用了malloc所以此時的自由存儲區就是堆區,但C++支持運算符重載,如果我們對new運算符進行了重載,可能在內存申請上就可以從堆區外的其他區域申請,此時的自由存儲區就不是堆區了。

引用

引用的基本使用

**作用:**給變量起別名

語法:

數據類型 &別名 = 原名 

示例:

/*************************************************************************> File Name:    demo05.cpp> Author:       小劉> Description:  引用> Created Time: 2025-08-18 15:36:43************************************************************************/
#include <iostream>
#include <iomanip>using namespace std;int main()
{// 定義一個變量int a = 10;// 定義引用int &b = a; // 此時a和b的空間是共享的,也就是b的空間是它的引用的對象a的空間 真正的引用是b & 是一個操作符cout << "a = " << a << endl; // a = 10cout << "b = " << b << endl; // b = 10cout << "a 的地址 " << &a << endl; //a 的地址 0x7f5bdffba4cout << "b 的地址 " << &b << endl; //b 的地址 0x7f5bdffba4b = 100;cout << "a = " << a << endl; // a = 100cout << "b = " << b << endl; // b = 100int aa = 10;int *p = &aa;cout << "aa 的地址 " << &aa << endl; //aa 的地址 0x5c725ff750cout << "p 的地址 " << &p << endl; //p 的地址 0x5c725ff748return 0;
}

引用注意事項

  • 引用必須初始化,否則沒有意義
  • 引用在初始化后,不可以改變

引用特點:

①引用不可以改變

②引用對象的值可以改變

示例:

/*************************************************************************> File Name:    demo06.cpp> Author:       小劉> Description:  引用相關案例> Created Time: 2025-08-18 15:51:25************************************************************************/
#include <iostream>
#include <iomanip>using namespace std;int main()
{int a = 10;int b = 20;// int &c; 錯誤,引用必須初始化int &c = a;// 一旦初始化后,就不可以改變c = b; // 這是賦值操作,不是改變引用cout << "a = " << a << endl; // a = 20cout << "b = " << b << endl; // b = 20cout << "c = " << c << endl; // c = 20return 0;
}

引用做函數參數

**作用:**函數傳參時,可以引用的技術讓形參修飾實參

**優點:**可以簡化指針修改實參

示例

/*************************************************************************> File Name:    demo07.cpp> Author:       小劉> Description:  值傳遞、地址傳遞、引用傳遞> Created Time: 2025-08-18 15:57:19************************************************************************/
#include <iostream>
#include <iomanip>using namespace std;/*
* 1.值傳遞
*/
void mySwap01(int a, int b)
{int temp = a ;a = b;b = temp;
}/*
* 2.地址傳遞
*/
void mySwap02(int* a, int* b)
{int temp = *a ;*a = *b;*b = temp;
}/*
* 3.引用傳遞(C語言不支持)
*/
void mySwap03(int& a, int& b)
{int temp = a ;a = b;b = temp;
}int main()
{int a = 10 ,b = 20; mySwap01(a,b); // 普通的值傳遞,形參和實參空間是獨立的cout << "a = " << a << ", b = " << b << endl;mySwap02(&a,&b); // 地址傳遞,形參和實參空間是共享的cout << "a = " << a << ", b = " << b << endl;mySwap02(&a,&b); // 引用傳遞,形參就是使用實參的空間cout << "a = " << a << ", b = " << b << endl;return 0;
}

總結:通過引用參數的效果同按地址傳遞一樣的。引用的語法更清楚簡單

引用做函數返回值

**作用:**引用是可以作為函數的返回值存在的。

**注意:**不要返回局部變量的引用。因為會產生野指針。

示例

/*************************************************************************> File Name:    demo08.cpp> Author:       小劉> Description:  > Created Time: 2025-08-18 16:12:13************************************************************************/
#include <iostream>
#include <iomanip>using namespace std;/*
* 返回局部變量引用
*/int& text01()
{
int a = 10;
return a;
}/*
* 返回局部變量引用
*/
int& text02()
{static int a = 20; // 局部變量cout << "a = " << a << endl; return a;
}int main()
{// 不能返回局部變量的引用//int& ref = text01();// cout << "ref = " << ref << endl;  // 這種寫法有問題,因為引用的空間已經提前釋放了int& ref2 = text02();cout << "ref2= " << ref2 << endl;text02() = 1000;cout << "ref2= " << ref2 << endl;text02();return 0;
}

引用本質

本質:引用的本質在C++內部實現是一個指針常量

示例:

// 發現是引用, 轉換為 int* const ref = &a;
void func(int& ref){
ref = 100; // ref是引用, 轉換為*ref = 100
}
int main(){int a = 10;//自動轉換為 int* const ref = &a; 指針常量是指針指向不可改, 也說明為什么引用不可更改int& ref = a;ref = 20; //內部發現ref是引用, 自動幫我們轉換為: *ref = 20;cout << "a:" << a << endl;cout << "ref:" << ref << endl;func(a);return 0;
}

結論:C++推薦用應用技術,因為方便,引用本質是指針常量,但是所有的指針操作編譯器都幫我們做了

常量引用

**作用:**常量引用主要用來修飾形參,放置誤操作

在函數新參列表中可以加const 修飾形參,防止形參改變實參

/*************************************************************************> File Name:    demo09.cpp> Author:       小劉> Description:  常量引用> Created Time: 2025-08-18 16:55:03************************************************************************/
#include <iostream>
#include <iomanip>using namespace std;// 引用使用場景,通常來修飾形參
void showValue(const int& v)
{//v+= 10 ;等價于 v = v + 10;cout << v << endl;
}int main()
{// int& ref = 10; 引用本身需要一個合法的內存空間// 加入const就可以了, 編譯器優化代碼: int temp = 10; const int& ref = temp;const int& ref = 10;// ref = 100; // 加入coust 后不可以修改變量cout << ref <<endl; // 10// 函數中利用常量引用防止誤操作修改實參int a =20;showValue(a);return 0;
}

思考題:

? 什么是零拷貝?

函數擴展

函數默認參數

在C++中,函數的形參列表中的形參可以有默認值。

語法:

返回值類型 函數名( 參數 = 默認值) {}

示例:

/*************************************************************************> File Name:    demo10.cpp> Author:       小劉> Description:  > Created Time: 2025-08-18 17:24:22************************************************************************/
#include <iostream>
#include <iomanip>using namespace std;int func(int a, int b = 10,int c = 10)// 如果有對應的實參賦值操作, 形參默認值失效
{return a + b + c;
}int main()
{cout << "rst = " << func(20,20) << endl;// ret = 50 如果有實參, 使用實參數據, 如果無實參, 使用形參默認數據cout << "rst = " << func(100) << endl;// ret = 120return 0;
}

函數占位參數

C++ 中函數的形參列表里有占位參數,用來做占位,調用函數時必須填補該位置

語法: 返回值類型 函數名 (數據類型){}

在現階段函數的占位參數存在意義不大,但是后面的課程中會用到該技術

示例:

//函數占位參數 , 占位參數也可以有默認參數
void func(int a, int) {cout << "this is func" << endl;
}int main() {func(10,10); //占位參數必須填補system("pause");return 0;
}

函數重載

函數重載概述

**作用:**函數名可以相同,提高復用性

函數重載滿足的條件

  • 同一個作用域下(比如同一個文件中)
  • 函數名稱相同
  • 函數參數類型不同或者參數個數不同或者順序不同

**注意:**函數的返回值不可以作為函數重載的條件,也就是說函數重載跟返回值無關。

示例:

// 函數重載需要函數都在同一個作用域下, 比如在同一個文件中
void func()
{cout << "func 的調用! " << endl;
} 
void func(int a)
{cout << "func (int a) 的調用! " << endl;
}
void func(double a)
{cout << "func (double a)的調用! " << endl;
}
void func(int a ,double b)
{cout << "func (int a ,double b) 的調用! " << endl;
} 
void func(double a ,int b)
{cout << "func (double a ,int b)的調用! " << endl;
} //函數返回值不可以作為函數重載條件
//int func(double c, int d)
//{
// cout << "func (double c ,int d)的調用! " << endl;
//}int main() {func();func(10);func(3.14);func(10,3.14);func(3.14 , 10);system("pause");return 0;
}
函數重載注意事項
  • 引用作為重載條件
  • 函數重載碰到函數默認參數

示例:

/*************************************************************************> File Name:    demo11.cpp> Author:       小劉> Description:  函數重載(函數重載注意事項)> Created Time: 2025-08-18 17:37:33************************************************************************/
#include <iostream>
#include <iomanip>using namespace std;/*
* 1.引用作為重載條件
*/
void func(int &a) // 引用不占用任何內存空間,引用的值可變
{cout << "func(int &a) 調用" << endl;
}void func(const int &a) //常量引用,引用的值不可變,一般只讀操作
{cout << "func(const int &a) 調用" << endl;
}/*
* 2.函數重載碰到函數默認參數
*/
void func2(int a ,int b = 10)
{cout << "func(int a,int b = 10) 調用"  << endl;
}void func2(int a)
{cout << "func(int a) 調用" << endl;
}int main()
{int a = 10;func(a); 	// 調用無constfunc(10); 	// 調用有constfunc2(10,20); // func2(10);     // 碰到默認參數產生歧義,需要避免return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/96996.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/96996.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/96996.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LeaferJS創建支持縮放、平移的畫布,并繪制簡單圖形

文章目錄介紹原生JS使用LeaferJS的簡單示例原生JS使用LeaferJS并支持縮放平移畫布Vue中使用LeaferJS并支持縮放平移介紹 LeaferJS官網&#xff1a;https://www.leaferjs.com/ 官方快速上手的教程地址&#xff1a;https://www.leaferjs.com/ui/guide/install/ui/start.html 原…

JumpServer 堡壘機部署與 SSH 公鑰接入服務器教程

前言&#xff1a;在企業運維場景中&#xff0c;服務器的安全訪問與操作管控至關重要。JumpServer 作為開源堡壘機的典型代表&#xff0c;憑借集中管控、權限精細分配、操作全鏈路審計等核心能力&#xff0c;成為保障運維安全合規的關鍵工具。 無論是中小企業簡化運維權限管理&a…

TensorFlow 面試題及詳細答案 120道(21-30)-- 模型構建與神經網絡

《前后端面試題》專欄集合了前后端各個知識模塊的面試題,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs,nodejs,mangoDB,SQL,Linux… 。 前后端面試題-專欄總目錄 文章目錄 一、本文面試題目錄 21. TensorFlow中構建神經…

Qt圖片上傳系統的設計與實現:從客戶端到服務器的完整方案

文章目錄系統架構概覽核心組件解析1. ImageUploadWorker&#xff1a;上傳任務的執行者關鍵方法解析2. ImageUploadManager&#xff1a;線程的"指揮官"3. ImageUploader&#xff1a;網絡通信的"信使"4. 服務器端&#xff1a;圖片的"收納箱"關鍵技…

MySQL InnoDB vs MyISAM

MySQL 兩種引擎&#xff08;InnoDB vs MyISAM&#xff09;核心區別事務與鎖機制??特性??InnoDB??MyISAM??事務支持?支持 ACID 事務&#xff08;原子性、一致性、隔離性、持久性&#xff09;&#xff0c;適用于需強數據一致性的場景&#xff08;如金融交易&#xff09;…

軟件定義汽車(SDV)調試——如何做到 適配軟件定義汽車(SDV)?(上)

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 做到欲望極簡,了解自己的真實欲望,不受外在潮流的影響,不盲從,不跟風。把自己的精力全部用在自己。一是去掉多余,凡事找規律,基礎是誠信;二是…

windows下 docker desktop 清理ext4.vhdx文件 并縮小ext4.vhdx文件

1、路徑C:\Users\Administrator\AppData\Local\Docker\wsl\dataext4.vhdx 清理之前30多G&#xff0c;現在只有不到2個G2、清理命令# 1、清?清理懸空鏡像和緩存? docker image prune -f # 刪除未被引用的鏡像層 docker builder prune -f # 清理構建緩存# 2、壓縮虛擬磁盤&a…

超越ChatBI!深度解析衡石HENGSHI SENSE 6.0如何實現全流程AI賦能

在數據智能領域風起云涌的2025年&#xff0c;“ChatBI”已成為一個炙手可熱卻又令人疲憊的概念。市場上充斥著各式各樣的問答式BI工具&#xff0c;它們雖然帶來了交互的新穎體驗&#xff0c;卻往往局限于“問答”這一單一環節&#xff0c;無法解決數據從整合到洞察的全鏈路痛點…

Apple Silicon Mac 上解決 Docker 平臺不匹配和 QEMU 段錯誤問題

問題概述 許多用戶在 Apple Silicon (M1/M2) Mac 上嘗試運行 W3AF Docker 鏡像時遇到了以下錯誤: WARNING: The requested images platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested qemu: uncau…

如何借助文檔控件 TX Text Control 輕松優化 PDF 文件大小?

在數字文檔的日常使用中&#xff0c;PDF 文件的體積大小直接影響存儲空間、傳輸速度和打開體驗。尤其是在包含大量圖片、圖表或字體資源的文檔中&#xff0c;文件往往會變得非常龐大。 文檔處理控件TX Text Control 為開發者提供了多種可配置的工具與策略&#xff0c;幫助在不同…

[身份驗證腳手架] 前端認證與個人資料界面

第2章&#xff1a;前端認證與個人資料界面 歡迎回來&#xff0c;未來的Web開發者&#xff01;在前一章中&#xff0c;我們學習了breeze:install命令如何為您的Laravel應用設置用戶認證基礎。您選擇了一個"前端技術棧"(如Blade、React、Vue或Livewire)并運行了一些命…

RabbitMQ、RocketMQ 和 ActiveMQ 三種主流消息隊列的詳細部署安裝指南

RabbitMQ、RocketMQ 和 ActiveMQ 三種主流消息隊列的詳細部署安裝指南 RabbitMQ、RocketMQ 和 ActiveMQ 三種主流消息隊列的詳細部署安裝指南。 一、RabbitMQ 部署安裝 RabbitMQ 用 Erlang 語言編寫,推薦使用官方提供的 Docker 鏡像或包管理器安裝。 方法一:使用 Docker (…

vue新增用戶密碼框自動將當前用戶的密碼自動填充的問題

1.問題 新增店鋪的時候&#xff0c;設置管理員賬號&#xff0c;輸入框已將當前登錄用戶的密碼填充上了解決方式 在el-input輸入框類型為password的上增加參數autocomplete“new-password”<el-form-item :label"$t(storeList.password)" prop"shopUserPasswo…

設計模式:工廠模式(Factory Pattern)

文章目錄一、工廠模式簡介二、簡單工廠模式的概念三、工廠方法模式的概念四、抽象工廠模式的概念一、工廠模式簡介 工廠模式是一種創建型設計模式&#xff0c;主要解決對象創建 的問題。它的核心思想是&#xff1a;把對象的創建和使用分離&#xff0c;讓使用者不直接依賴具體類…

【Qt調試】斷點時,Expressions不能查看變量

環境Qt版本&#xff1a;6.9.1問題Qt creator進入斷點&#xff0c;Expressions不能查看變量&#xff08;類型&#xff1a;int&#xff09;的值&#xff0c;而局部變量可以查看。解決方法調試器/CDB&#xff0c;勾選【Use Python dumper】

C++ 函數:從基礎到現代特性的全面解析

《C++ 函數:從基礎到現代特性的全面解析》 目錄 函數基礎 1.1 函數定義與聲明 1.2 參數傳遞機制(值傳遞、引用傳遞、指針傳遞) 1.3 返回值與void函數 1.4 函數聲明與定義的分離 函數進階 2.1 函數重載的多態性 2.2 遞歸函數的設計與優化 2.3 Lambda表達式與匿名函數 2.4 函…

【AMBA總線互聯IP】

1 常見AMBA互聯總線IP 1.1 常見的IP工具 1.ARM: NIC-4xx 2.Synopsys: Designwave IP for AMBA interconnect 3.Sonicsinc: Non-conherent NoC only, no coherent noc. 4.Netspeed: Gemini Origin–Congiurable cache coherent. 5.Arterix(FlexNoc, Ncore):Ncore–support CHI,…

PEFT 模型解析(59)

PEFT 模型 若你使用 SFTTrainer 類進行訓練(第 5 課將詳細介紹),僅配置信息可能就足夠了 —— 該類會在底層自動完成適配器(adapters)與基礎模型的關聯工作。 不過目前,我們選擇手動完成這一操作,以便更深入理解模型是如何被實際修改的。這個過程非常簡單:我們只需調用…

flume監控目錄文件實戰:三種 Source 方案對比與配置指南

flume監控目錄文件實戰&#xff1a;三種 Source 方案對比與配置指南 在實際業務中&#xff0c;監控目錄文件變化并實時采集數據是常見需求&#xff08;如應用日志、業務數據文件等&#xff09;。Flume 提供了三種主流方案實現目錄文件監控&#xff0c;各有優劣。本文將詳細講解…

從串口到屏幕:如何用C#構建一個軍工級數據實時監控

你是否曾想過&#xff0c;那些在軍事、航天或工業控制中呼嘯而過的導彈、無人機&#xff0c;它們內部的狀態數據是如何被地面人員實時捕獲、解析并清晰呈現的&#xff1f;今天&#xff0c;我們將深入剖析一個完整的C#項目——串口數據實時顯示系統&#xff0c;它不僅是一個串口…