首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C/C++ 結構體完整指南:定義、指標、參數傳遞與效能優化

     編輯:關於C++

一、結構體基礎

結構體是自訂資料型別,可包含不同型別成員,支援整體指派(陣列不支援)。定義本身不佔記憶體,宣告變數時才配置空間。

基本操作

struct test { int a; int b; };
int main() {
    test pn1, pn2;
    pn2.a = 10; pn2.b = 3;
    pn1 = pn2; // 整體複製
    test* ptr = &pn2;
    ptr->a = 99; // 指標存取成員用 ->
}

二、結構體作為函式參數:三種傳遞方式比較

方式語法效能適用場景
值傳遞void f(test p)複製整個結構,堆疊開銷大極小型結構
指標傳遞void f(test* p)僅傳遞位址,無複製大型結構、需修改原物件
參考傳遞void f(test& p)同指標效能,語法如值傳遞大型結構、需修改原物件(推薦)

程式碼範例

struct test { char name[10]; float score; };
void print_score(test& p) { cout << p.name << "|" << p.score << endl; }
int main() {
    test a[2] = {{"marry",88.5},{"jarck",98.5}};
    for (int i=0;i<2;i++) print_score(a[i]); // 參考傳遞
}

三、傳回結構體與參考的效能陷阱

範例 1:傳回值(低效)

test get_score() {
    test pn; cin >> pn.name >> pn.score;
    return pn; // 產生暫時物件 temp,再複製給呼叫端
}
int main() {
    test a[2];
    for (int i=0;i<2;i++) a[i] = get_score(); // 兩次複製
}

範例 2:參考傳遞輸出參數(高效)

void get_score(test& pn) { cin >> pn.name >> pn.score; } // 直接操作原物件
int main() {
    test a[2];
    for (int i=0;i<2;i++) get_score(a[i]); // 零複製
}

差異分析: 範例 1 在函式內建立區域物件、傳回時產生暫時物件、指派時再複製;範例 2 直接對呼叫端物件操作,無額外記憶體配置與複製。

傳回參考進階用法

test a; // 全域物件
test& get_score(test& pn) { cin >> pn.name >> pn.score; return pn; }
int main() {
    test& sp = get_score(a); // 直接綁定全域物件 a
    cout << sp.name << "|" << sp.score;
}

四、指標參考

int*& ref = ptr; 為指標的別名,可修改指標指向:

int a=0, b=10;
int *p1=&a, *p2=&b;
int*& rp = p1;
rp = p2; // p1 現在指向 b

五、效能優化總結

  1. 大型結構優先使用參考傳遞(const T& 唯讀,T& 可修改)。
  2. 輸出參數用參考替代指標,語法更清晰。
  3. 避免函式傳回大型結構值;若必須傳回,考慮 std::move (C++11) 或輸出參數模式。
  4. 善用 const 修飾唯讀參考,編譯器可進一步優化。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved