C++引用:高效安全的別名機制詳解

目錄

一、引用的概念

二、引用的特性

1、定義時必須初始化

2、一個變量可以有多個引用

3、引用一旦綁定實體就不能更改

三、const引用(常引用)

1、const引用的基本特性

2、臨時對象與const引用

3、臨時對象的特性

4、const?引用作為函數形參

1. 基本示例(類型不匹配時創建臨時對象)

2. 數值類型轉換(臨時對象存儲轉換后的值)

3. 如果形參是?非 const 引用,則不允許綁定臨時對象

4. 類對象的隱式轉換(臨時對象 +?const?引用)

總結

四、引用的使用場景

1、引用作為函數參數

引用傳參的工程價值

2、引用作為函數返回值

返回引用最佳實踐

注意:

五、引用與指針的區別(超重要!!!)

引用與指針的工程選擇準則

C++引用與其他語言引用的本質區別

關鍵差異點

六、引用的優點

七、數據結構中的引用實踐

1、C風格二級指針實現解析

關鍵點解析

調用方式

2、C++引用風格實現解析

關鍵改進

調用方式

3、兩種實現的底層對比

內存布局示例

八、現代C++中的引用演進(后面會學到,現在先了解)

1、右值引用(C++11引入)

2、完美轉發

3、結構化綁定(C++17)

九、引用使用的注意事項

1、避免懸垂引用

2、接口設計原則

3、多線程環境


一、引用的概念

????????引用(Reference)是C++中一種重要的復合類型,它不是定義一個新的變量,而是為已存在的變量提供一個別名。編譯器不會為引用變量單獨分配內存空間,引用變量與其引用的實體共享同一塊內存空間。

????????C++中為了避免引入太多的運算符,會復用C語言的一些符號,比如前面的>>和<<,這里引用也和取地址使用了同?個符號&,大家注意使用方法角度區分就可以。(吐槽一下,這個問題其實挺坑的,個人覺得用更多符號反而更好,不容易混淆)

基本語法形式:

類型& 引用變量名 = 引用實體;

重要說明引用類型必須與引用實體是同種類型。?

示例代碼:

#include <iostream>
using namespace std;int main() {int a = 10;int& b = a;  // 給變量a取一個別名bcout << "a = " << a << endl;  // 輸出10cout << "b = " << b << endl;  // 輸出10b = 20;  // 通過引用修改變量值cout << "a = " << a << endl;  // 輸出20cout << "b = " << b << endl;  // 輸出20return 0;
}


二、引用的特性

1、定義時必須初始化

  • 引用必須在聲明時進行初始化,不能先聲明后賦值

  • 正確示例:

    int a = 10;
    int& b = a;  // 正確:定義時初始化
  • 錯誤示例:

    int c = 10;
    int &d;     // 錯誤:未初始化
    d = c;

2、一個變量可以有多個引用

int a = 10;
int& b = a;
int& c = a;
int& d = a;

此時,b、c、d都是變量a的別名。

3、引用一旦綁定實體就不能更改

  • 引用在初始化后不能改為指向其他實體

  • 示例:

    int a = 10;
    int& b = a;
    int c = 20;
    b = c;  // 這不是改變引用指向,而是將a的值改為20

三、const引用(常引用)

????????上面提到,引用類型必須和引用實體是同種類型的。但是僅僅是同種類型,還不能保證能夠引用成功,我們若用一個普通引用類型去引用其對應的類型,但該類型被const所修飾,那么引用將不會成功。

常引用(const reference)用于引用常量或臨時對象,具有以下特點:

  1. 可以引用常量

  2. 可以延長臨時對象的生命周期

  3. 不能通過常引用修改被引用的對象

示例:

int main() {const int a = 10;// int& ra = a;    // 錯誤:不能用普通引用引用常量const int& ra = a;  // 正確// int& b = 10;    // 錯誤:不能引用字面常量const int& b = 10;  // 正確double pi = 3.14159;// int& rpi = pi;  // 錯誤:類型不匹配const int& rpi = pi; // 正確:會發生隱式轉換return 0;
}

????????我們可以將被const修飾了的類型理解為安全的類型,因為其不能被修改。我們若將一個安全的類型交給一個不安全的類型(可被修改),那么將不會成功。?

1、const引用的基本特性

const引用是C++中一種特殊的引用類型,具有以下重要特性:

  1. 引用const對象:必須使用const引用來引用const對象

    const int a = 10;
    const int& ra = a;  // 正確
    int& rb = a;       // 錯誤:不能使用非const引用引用const對象,這是權限的放大
  2. 引用普通對象:const引用可以引用普通對象,這是權限的縮小

    int b = 20;
    const int& rb = b;  // 正確:權限縮小
  3. 權限規則

    • 權限可以縮小(從可修改到只讀)

    • 但不能放大(從只讀到可修改)

2、臨時對象與const引用

????????C++中有幾種常見情況會產生臨時對象(以下各點都同理):臨時對象具有常性!!!(重要!!!)

  1. 表達式結果

    int a = 5;
    const int& rb = a * 3;  // 正確:a*3的結果存儲在臨時對象中
    int& rc = a * 3;       // 錯誤:臨時對象具有常性

  2. 類型轉換

    double d = 12.34;
    const int& rd = d;     // 正確:類型轉換產生臨時int對象
    int& re = d;          // 錯誤:臨時對象具有常性

3、臨時對象的特性

????????臨時對象(temporary object)是編譯器在需要暫存表達式求值結果時自動創建的未命名對象,具有以下特點:

  1. 常性:臨時對象默認具有const屬性(常性)

    int a = 5;
    const int& r1 = a * 2;  // 正確:臨時對象具有常性,可以用 const 引用綁定
    int& r2 = a * 2;        // 錯誤:臨時對象是 const 的,不能綁定非 const 引用
  2. 生命周期臨時對象通常會在表達式結束時銷毀,但如果綁定到?const?引用,其生命周期會延長至該引用的作用域結束。

    #include <iostream>int main() {// 臨時int直接使用 - 表達式結束就"消失"std::cout << "臨時int值: " << 42 << std::endl;// 綁定到const引用 - 生命周期延長const int& ref = 123;  // 臨時123會一直存在直到main結束std::cout << "通過引用訪問: " << ref << std::endl;return 0;
    }

    說明:第一個42是純臨時值,用完即"消失";第二個123因為綁定到const引用ref,所以會一直存在直到main函數結束

  3. 隱式創建編譯器自動生成臨時對象的情況:(超重要!!!)

    • 表達式求值結果

      int x = 10, y = 20;
      const int& sum = x + y;  // x + y 的結果存儲在臨時對象中

      當表達式的結果需要存儲時,編譯器會生成臨時對象。

    • 類型轉換中間結果

      double d = 3.14;
      const int& intVal = d;  // 生成臨時 int 對象存儲截斷后的值(3)

      當隱式類型轉換發生時,編譯器會生成臨時對象存儲轉換后的值。

    • 函數返回值(未使用移動語義時)

      std::string createString() {return "Temporary";  // 返回臨時對象
      }int main() {const std::string& s = createString();  // 臨時對象的生命周期延長std::cout << s << std::endl;  // 正確:"Temporary"return 0;
      }

      當函數返回一個臨時對象時,如果沒有優化(如 RVO/NRVO),編譯器會生成臨時對象。

4、const?引用作為函數形參

????????當?const?引用作為函數形參?時,如果傳入的實參類型不匹配(但可以隱式轉換),編譯器會自動創建臨時對象來存儲轉換后的值,并讓?const?引用綁定到這個臨時對象。(學到后面再回看)

1. 基本示例(類型不匹配時創建臨時對象)

void print(const std::string& str) {std::cout << str << std::endl;
}int main() {print("Hello");  // "Hello" 是 const char[6],編譯器生成臨時 std::string 對象return 0;
}

發生了什么?

  1. "Hello"?的類型是?const char[6],而?print?的參數是?const std::string&

  2. 編譯器隱式調用?std::string?的構造函數,生成一個臨時?std::string?對象。

  3. const std::string& str?綁定到這個臨時對象,臨時對象的生命周期延長至?print?函數結束

2. 數值類型轉換(臨時對象存儲轉換后的值)

void printInt(const int& num) {std::cout << num << std::endl;
}int main() {double d = 3.14;printInt(d);  // 生成臨時 int 對象存儲截斷后的值(3)return 0;
}

發生了什么?

  1. d?是?double?類型,而?printInt?的參數是?const int&

  2. 編譯器生成一個臨時?int?對象,存儲?d?截斷后的值(3)。

  3. const int& num?綁定到這個臨時?int?對象。

3. 如果形參是?非 const 引用,則不允許綁定臨時對象

void modify(int& num) {  // 非 const 引用num = 100;
}int main() {modify(42);  // 錯誤!臨時對象不能綁定到非 const 引用return 0;
}

為什么不行?

  • 生成臨時對象,但是它不能綁定到非const引用中。

  • 臨時對象是?const?的,不能通過?非 const 引用?修改。

  • C++ 禁止這種行為,避免邏輯錯誤(修改一個即將銷毀的臨時對象沒有意義)。

4. 類對象的隱式轉換(臨時對象 +?const?引用)

class MyString {
public:MyString(const char* s) { std::cout << "構造臨時 MyString\n"; }
};void printStr(const MyString& s) {std::cout << "使用 MyString\n";
}int main() {printStr("Hello");  // 生成臨時 MyString 對象return 0;
}

輸出:

說明:

  • "Hello"?觸發?MyString?的構造函數,生成臨時對象。

  • const MyString& s?綁定到這個臨時對象,生命周期延長至?printStr?結束。

總結

情況是否生成臨時對象?是否合法?
const T&?形參 +?可隱式轉換的實參?? 生成?? 合法
const T&?形參 +?完全匹配的實參? 不生成?? 合法
T&?形參(非?const?引用) +?臨時對象?? 生成? 非法

關鍵點:

  1. const?引用可以延長臨時對象的生命周期,避免懸垂引用。

  2. 非?const?引用不能綁定臨時對象,因為臨時對象是只讀的。

  3. 這種機制使得?const?引用在接受字面量、表達式結果、類型轉換結果時更加靈活和安全。

這在 C++ 的函數參數傳遞、返回值優化(RVO)、隱式轉換等場景中非常重要!


四、引用的使用場景

1、引用作為函數參數

引用作為函數參數可以實現高效傳參,避免拷貝開銷,同時可以修改實參的值。

示例(交換函數)

????????還記得C語言中的交換函數,學習C語言的時候經常用交換函數來說明傳值和傳址的區別。現在我們學習了引用,可以不用指針作為形參了:

void Swap(int& a, int& b) {int tmp = a;a = b;b = tmp;
}

因為在這里a和b是傳入實參的引用,我們將a和b的值交換,就相當于將傳入的兩個實參交換了。?

引用傳參的工程價值

引用傳參在C++中主要有兩大優勢:

  1. 性能優化:避免大型對象拷貝帶來的性能損耗

  2. 語義明確:通過引用明確表達函數可能修改參數值的意圖

// 性能敏感場景:傳遞大型結構體
void ProcessLargeData(const BigData& data) {  // const引用避免拷貝// 只讀操作...
}// 需要修改參數的場景
void TransformData(Matrix& matrix) {  // 非const引用表明會修改參數matrix.invert();
}

2、引用作為函數返回值

引用可以作為函數返回值,但需要注意:

  • 不能返回局部變量的引用(除非是static局部變量)(因為在函數內部定義的普通的局部變量會隨著函數調用的結束而被銷毀)

  • 可以返回類成員變量、全局變量或動態分配內存的引用(不會隨著函數調用的結束而被銷毀的數據)

  • 可以返回函數參數中的引用

引用返回值的使用需要特別注意生命周期管理:

// 安全示例:返回靜態變量或成員變量的引用
int& GetStaticValue() {static int value = 0;  // 靜態變量生命周期與程序相同return value;
}// 危險示例:返回局部變量的引用
int& DangerousFunction() {int local = 42;       // 局部變量將在函數返回后被銷毀return local;         // 編譯器警告:返回局部變量的引用
}

返回引用最佳實踐

  1. 返回對象成員變量時

  2. 返回函數內靜態變量時

  3. 返回動態分配的對象時(需配合智能指針)

  4. 返回參數中傳入的引用時

注意:

????????如果函數返回時,出了函數作用域,返回對象還未還給系統,則可以使用引用返回;如果已經還給系統了,則必須使用傳值返回。?


五、引用與指針的區別(超重要!!!)

????????在C++中,指針和引用就像一對性格迥異的孿生兄弟。指針如同大哥,引用則像小弟,二者在實踐中相得益彰。雖然功能有所重疊,但各自擁有獨特的特點,彼此不可替代。

雖然引用在底層實現上通常是通過指針實現的,但在語法和使用上有顯著區別:

特性引用指針
開辟內存空間不開辟內存空間(引用只是一個變量的取別名)要開辟內存空間(指針存儲一個變量的地址)
初始化要求必須初始化可以不初始化
可修改性一旦綁定實體就不能更改可以隨時改變指向
NULL值不能為NULL可以為NULL
sizeof結果引用類型的大小指針的大小始終是地址空間所占字節個數(32位平臺下占4個字節,64位下是8byte)
自增操作實體值增加1指向下一個同類型對象
多級間接訪問不支持多級引用支持多級指針
訪問方式自動解引用需要顯式解引用
安全性更高(引用很少出現空指針和野指針的問題)相對較低(指針很容易出現空指針和野指針的問題)

在語法概念上,引用就是一個別名,沒有獨立的空間,其和引用實體共用同一塊空間。?

int main() {int a = 10;int& ra = a;    // 底層通常實現為指針ra = 20;       // 自動解引用int* pa = &a;   // 顯式指針*pa = 20;      // 顯式解引用return 0;
}

但是在底層實現上,引用實際是有空間的,底層實現示例(匯編層面):

從匯編角度來看,引用的底層實現也是類似指針存地址的方式來處理的。?

引用與指針的工程選擇準則

場景推薦選擇理由
必須重新綁定指針引用一旦綁定不可更改
可能為nullptr指針引用不能為null
容器存儲指針引用不是對象,不能直接存儲
函數參數常引用優先更清晰的語義,更安全的const保證
操作符重載引用更自然的語法
多態操作指針或引用根據是否需要重新綁定決定

C++引用與其他語言引用的本質區別

// C++引用示例
int a = 10;
int& ref = a;  // 永久綁定到a
int b = 20;
// ref = b;    // 不是重新綁定,而是賦值操作
// Java"引用"示例
Integer a = new Integer(10);
Integer ref = a;  // 可以重新指向其他對象
Integer b = new Integer(20);
ref = b;         // 合法操作,ref現在指向b
關鍵差異點
  1. 綁定靈活性:C++引用是永久綁定,Java引用可重新指向

  2. 空值處理:C++引用不能為null,Java引用可以為null

  3. 內存管理:C++引用不涉及內存管理,Java引用與GC機制緊密相關


六、引用的優點

  1. 更清晰的語法:引用使代碼更易讀,避免了指針的復雜語法

  2. 更安全:引用必須初始化且不能為NULL,減少了空指針風險

  3. 更高效:避免了值傳遞的拷貝開銷

  4. 支持運算符重載:使自定義類型的運算符重載更自然


七、數據結構中的引用實踐

????????在部分采用C代碼實現的數據結構教材中,作者會使用C++的引用替代指針傳參來簡化程序,避免復雜的指針操作。但由于許多學生尚未掌握引用這一概念,反而增加了理解難度。

在傳統C風格數據結構改造中,同時引用也可以顯著提升代碼可讀性,例子如下:

1、C風格二級指針實現解析

在傳統C語言中,由于沒有引用概念,修改鏈表頭指針需要使用二級指針:

// 節點結構定義
typedef struct Node {int value;struct Node* next;
} Node;// 創建新節點
Node* createNode(int value) {Node* newNode = (Node*)malloc(sizeof(Node));newNode->value = value;newNode->next = nullptr;return newNode;
}// 在鏈表頭部插入節點
void insertNode(Node** head, int value) {Node* newNode = createNode(value);newNode->next = *head;  // 新節點指向原頭節點*head = newNode;        // 修改頭指針指向新節點
}

關鍵點解析

  1. 二級指針的必要性:為了修改調用方的頭指針,需要傳遞指針的地址

  2. 解引用操作:通過*head訪問實際的頭指針

  3. 操作順序:必須先設置新節點的next指針,再更新頭指針

調用方式

Node* head = nullptr;  // 空鏈表
insertNode(&head, 10); // 必須傳遞頭指針的地址
insertNode(&head, 20);

2、C++引用風格實現解析

C++引用提供了更直觀的語法來修改指針:

struct Node {int value;Node* next;
};Node* createNode(int value) {Node* newNode = new Node;newNode->value = value;newNode->next = nullptr;return newNode;
}// 使用引用簡化鏈表操作
void insertNode(Node*& head, int value) {Node* newNode = createNode(value);newNode->next = head;  // 直接使用head引用head = newNode;        // 直接修改head引用
}

關鍵改進

  1. 語法簡化Node*&表示對指針的引用,無需二級指針

  2. 直觀操作直接操作head就像操作原始指針一樣

  3. 類型安全引用必須初始化,避免了空指針風險

調用方式

Node* head = nullptr;  // 空鏈表
insertNode(head, 10);  // 直接傳遞指針,無需取地址
insertNode(head, 20);

3、兩種實現的底層對比

內存布局示例

調用方:[head指針] -> [節點A] -> [節點B] -> nullptr

C風格:調用棧保存head指針的地址,然后函數內通過解引用修改head指針

C++風格:調用棧保存head指針的引用(編譯器通常用指針實現),然后函數內直接操作引用


八、現代C++中的引用演進(后面會學到,現在先了解)

1、右值引用(C++11引入)

void process(std::string&& str) {  // 移動語義支持// 可以安全"竊取"str的資源
}

2、完美轉發

template<typename T>
void relay(T&& arg) {  // 通用引用process(std::forward<T>(arg));  // 保持值類別
}

3、結構化綁定(C++17)

std::map<int, std::string> m;
for (auto& [key, value] : m) {  // 引用綁定到map元素// 直接修改map中的值
}

九、引用使用的注意事項

1、避免懸垂引用

  • 不要返回局部變量的引用

  • 不要返回臨時對象的引用

  • 注意lambda捕獲引用時的生命周期

2、接口設計原則

  • 輸入參數:const引用優先

  • 輸出參數:非const引用明確修改意圖

  • 返回值:值返回優先,必要時返回引用

3、多線程環境

  • 共享數據的引用訪問需要同步

  • 避免跨線程傳遞局部變量的引用

????????引用作為C++的核心特性,其正確使用需要開發者深入理解其語義和限制。在性能關鍵代碼中合理使用引用,可以顯著提升程序效率,同時保持代碼的清晰性和安全性。

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

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

相關文章

大語言模型API付費?

下面是目前主流 大語言模型 API 的付費情況總覽&#xff1a; &#x1f9e0; 一、主要大語言模型 API&#xff1a;是否付費對比 提供方模型是否免費限制 / 說明OpenAIGPT-3.5 / GPT-4 / GPT-4o? 付費為主有免費額度&#xff08;如 ChatGPT 免費版&#xff09;&#xff0c;API …

巧用Wisdom SSH:容器化運維與傳統運維的抉擇

巧用Wisdom SSH&#xff1a;容器化運維與傳統運維的抉擇 在當下的技術領域&#xff0c;容器化運維與傳統運維是運維人員面臨的兩大主要方向&#xff0c;對于從業者來說&#xff0c;如何抉擇至關重要&#xff0c;而Wisdom SSH在其中能發揮顯著作用。 傳統運維&#xff1a;基石…

API征服者:Python抓取星鏈衛星實時軌跡

API征服者&#xff1a;Python抓取星鏈衛星實時軌跡從基礎調用到工業級衛星追蹤系統實戰指南一、太空數據時代&#xff1a;星鏈衛星的全球覆蓋??星鏈衛星網絡規模??&#xff1a;已發射衛星數量&#xff1a;4,000目標衛星總數&#xff1a;42,000軌道高度&#xff1a;340km - …

《深潛React列表渲染:調和算法與虛擬DOM Diff的優化深解》

當用戶在內容平臺無限滑動&#xff0c;或是在管理系統中處理成百上千條數據時&#xff0c;每一次無卡頓的交互&#xff0c;都是調和算法與虛擬DOM Diff機制協同工作的成果。理解這兩者的底層邏輯&#xff0c;不僅是性能優化的鑰匙&#xff0c;更是從“使用框架”到“理解框架”…

自動化與配置管理工具 ——Ansible

一、Ansible 概述1.1 核心特性Ansible 是一款開源的自動化運維工具&#xff0c;采用無代理&#xff08;Agentless&#xff09;架構&#xff0c;通過 SSH 協議實現對遠程節點的管理。其核心特性包括&#xff1a;無代理架構&#xff1a;被管理節點無需安裝代理軟件&#xff0c;降…

Effective C++ 條款18:讓接口容易被正確使用,不易被誤用

Effective C 條款18&#xff1a;讓接口容易被正確使用&#xff0c;不易被誤用核心思想&#xff1a;設計接口時&#xff0c;應使正確使用方式直觀自然&#xff0c;同時通過類型系統、行為約束等手段主動預防常見錯誤&#xff0c;減少用戶犯錯的可能性。 ?? 1. 接口誤用的常見陷…

nodejs讀寫文件

1.讀文件 node有很多模塊&#xff0c;可在node模塊查看相應模塊&#xff1b; var fsrequire(fs)fs.readFile(./src/a.doc,utf8,function(err,data){// 如果發生錯誤&#xff0c;data是undefined 如果成功 err為null console.log(err); console.log(data); }) 2.寫文件 var…

ConcurrentHashMapRedis實現二級緩存

1. 為什么使用ConcurrentHashMap&#xff1f;在Java中&#xff0c;ConcurrentHashMap 是一個線程安全且高效的哈希表實現&#xff0c;廣泛用于高并發場景。將其用作一級緩存的原因主要包括以下幾點&#xff1a;1.1. 線程安全性ConcurrentHashMap 是線程安全的&#xff0c;支持多…

Mysql集群技術

實驗在RHEL7中做&#xff0c;因為9中缺少了一個關鍵的高可用組件環境&#xff1a;兩臺數據庫&#xff0c;內存和CPU要多一點主流是MYSQL&#xff08;開源&#xff09;&#xff0c;Oracle收費較貴RHEL7中直接用make編譯是有問題的&#xff0c;所以需要要gcc工具做好前置準備&…

自動駕駛嵌入式軟件工程師面試題【持續更新】

文章目錄前言請描述 CAN 幀的基本結構&#xff08;包括標識符、數據字段、CRC 等&#xff09;描述 WebSocket 協議的基本工作流程&#xff08;包括握手、數據幀結構&#xff09;請說明如何實現 WebSocket 連接的心跳機制以檢測連接狀態&#xff0c;并描述在斷開后如何通過重連策…

vue(5)-組件

一.組件三大組成部分&#xff08;結構/樣式/邏輯&#xff09;&#xff08;1&#xff09;組件樣式沖突用scoped全局樣式在組件中起全局作用&#xff0c;局部樣式可以加scoped屬性來只作用于當前組件圖中只給baseone加這個樣式&#xff0c;就在baseone中style加scoped&#xff08…

【機器學習】兩大線性分類算法:邏輯回歸與線性判別分析:找到分界線的藝術

文章目錄一、核心概念&#xff1a;數據分類的"切分線"二、工作原理&#xff1a;從"找分界線"理解二、常見算法1、邏輯回歸&#xff1a;二分類2、線性判別分析&#xff08;LDA&#xff09;&#xff1a;分類與降維3、兩種算法對比分析三、實際應用&#xff1…

靜態分析c/cpp源碼函數調用關系圖生成

calltree calltree 不好使用 Dpxygen https://www.doxygen.nl/download.html Graphviz https://graphviz.org/download/ 靜態代碼調用結構圖分析、構建、生成 doxygen doxygen在win和linux上均可運行&#xff0c;可以自動分析源碼&#xff0c;對c語言項目友好&#xff0c;預處…

使用 MySQL Shell 進行 MySQL 單機到 InnoDB Cluster 的數據遷移實踐

遷移背景與環境原來都是用mysqldump&#xff0c;DTS或者cdc遷移&#xff0c;這次8.0用了下新工具感覺挺好用的&#xff0c;簡單快捷&#xff0c;30G數據不到源環境&#xff1a;單機 MySQL 8.0&#xff0c;地址為 172.23.3.28目標環境&#xff1a;InnoDB Cluster 集群&#xff0…

淘寶商品API可以獲取哪些商品詳情數據?

商品詳情頁商品全部sku信息"skus": {"sku": [{"price": 45.6,"total_price": 0,"orginal_price": 45.6,"properties": "1627207:39617249736","properties_name": "1627207:39617249736…

新一代PLC控制軟件平臺EsDA-AWStudio

在工業自動化和智能制造領域&#xff0c;高效的軟件平臺是提升開發效率和系統性能的關鍵。ZLG致遠電子推出的EsDA-AWStudio平臺&#xff0c;憑借其強大的功能和靈活的設計&#xff0c;為工業控制和物聯網應用提供了全新的解決方案。一站式PLC工業控制軟件平臺EsDA-AWStudioZLG致…

基于深度學習的醫學圖像分析:使用MobileNet實現醫學圖像分類

前言 醫學圖像分析是計算機視覺領域中的一個重要應用&#xff0c;特別是在醫學圖像分類任務中&#xff0c;深度學習技術已經取得了顯著的進展。醫學圖像分類是指將醫學圖像分配到預定義的類別中&#xff0c;這對于疾病的早期診斷和治療具有重要意義。近年來&#xff0c;MobileN…

docker 容器常用命令

在平常的開發工作中&#xff0c;我們經常需要使用 docker 容器&#xff0c;那么常用的 docker 容器命令有哪些呢&#xff1f;今天簡單總結下。 一&#xff1a;查看容器查看運行的容器&#xff1a;docker ps查看所有的容器&#xff1a;docker ps a查看容器詳細信息&#…

重型機械作業誤傷預警響應時間縮短80%!陌訊多模態識別算法在工程現場的應用優化

一、行業痛點&#xff1a;機械作業場景的識別困境據《工程機械安全白皮書&#xff08;2025&#xff09;》統計&#xff0c;施工現場因機械盲區導致的工傷事故中??78.3%由識別延遲引發??。核心難點包括&#xff1a;??動態遮擋問題??&#xff1a;吊臂擺動導致目標部件部分…

2025年ESWA SCI1區TOP,強化學習多目標灰狼算法MOGWO-RL+分布式混合流水車間調度,深度解析+性能實測

目錄1.摘要2.問題描述和數學建模3.強化學習多目標灰狼算法MOGWO-RL4.結果展示5.參考文獻6.算法輔導應用定制讀者交流1.摘要 本文針對大規模個性化制造&#xff08;MPM&#xff09;中的調度問題&#xff0c;提出了一種新的解決方案。MPM能夠在確保大規模生產的前提下&#xff0…