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

MFC 基礎實用知識大全:_T 宏、堆棧、Socket、多線程

     編輯:關於C語言

一、_T() 宏與字符集機制

核心作用

_T("") 讓代碼同時支持 ANSI(單字節)與 Unicode(雙字節)編譯模式:

  • 未定義 _UNICODE:_T("ABC") → "ABC" (ANSI)
  • 定義 _UNICODE:_T("ABC") → L"ABC" (寬字符)

關鍵類型對照表

類型含義字節/字符
LPSTR可修改字符串指標1
LPCSTR常量字符串指標1
LPTSTR可修改 TCHAR 字符串指標1 或 2
LPCTSTR常量 TCHAR 字符串指標1 或 2

最佳實踐

  • 字符串字面量統一用 _T("...") 或 _TEXT("...")
  • 變數聲明用 TCHAR、LPTSTR、LPCTSTR
  • 字符串操作用 _tcslen、_tcscpy 等 _tcs 系列,避免直接用 strlen/strcpy
  • _L 強制 Unicode,_T 自適應,優先用 _T

二、堆與棧的本質區別

維度堆棧
分配方式程序員手動 new/malloc編譯器自動(函數調用、局部變數)
釋放方式手動 delete/free,否則洩漏自動(作用域結束)
空間大小大(理論 2GB-4GB)小(通常 1MB-8MB)
碎片問題頻繁申釋產生碎片無碎片(棧幀連續)
分配效率較慢(需尋找塊)極快(指針移動)

類比:堆像「自助餐廳」靈活但需自理;棧像「套餐制」高效但受限。

三、Windows Socket 網絡編程核心

OSI 七層與 TCP/IP 四層對照

OSI 七層TCP/IP 四層關鍵協議
應用層、表示層、會話層應用層HTTP, FTP, SMTP, DNS, Telnet
傳輸層傳輸層TCP, UDP
網絡層網絡層IP, ICMP, IGMP
數據鏈路層、物理層網絡接口層Ethernet, WiFi, PPP

套接字類型

  • SOCK_STREAM:面向連接、可靠、TCP(如 HTTP、FTP)
  • SOCK_DGRAM:無連接、不可靠、UDP(如 DNS、視頻流)
  • SOCK_RAW:原始套接字,直接操作 IP 協議

TCP 服務端/客戶端標準流程

// 服務端
WSAStartup → socket → bind → listen → accept → send/recv → closesocket → WSACleanup

// 客戶端
WSAStartup → socket → connect → send/recv → closesocket → WSACleanup

UDP 簡化流程

無需 listen/accept/connect,直接 sendto/recvfrom 指定目標地址。

四、多線程核心概念

進程 vs 線程

  • 進程:程序運行實例,資源容器(4GB 虛擬地址空間、句柄表、內核對象)
  • 線程:CPU 調度單元,進程內執行實體。每進程至少一主線程
  • 關係:線程共享進程資源(堆、全局變數、代碼段),私有棧、寄存器、TLS

虛擬記憶體與 4GB 限制

32 位進程虛擬地址空間 4GB(2³²)。物理記憶體 + 頁文件構成虛擬記憶體。這是 32 位系統單進程寻址上限,也是記憶體條常不超 4GB 的原因(PAE 除外)。

線程內核對象與棧

  • 內核對象:存儲線程統計信息(ID、優先級、運行時間等)
  • 線程棧:維護函數調用鏈、參數、局部變數。默認 1MB,可調整

多線程 vs 多進程優勢

指標多線程多進程
記憶體開銷小(共享地址空間)大(獨立 4GB 空間)
切換開銷低(僅上下文切換)高(切換地址空間、TLB 刷新)
通信效率高(直接讀寫共享內存)低(IPC 機制:管道、共享內存、Socket)
穩定性低(一線程崩潰導致全進程死)高(進程隔離)

適用場景

  • 高併發 I/O、計算密集任務分解 → 多線程
  • 插件隔離、不同權限、故障隔離 → 多進程
  • 現代架構常採用:多進程 + 線程池(如 Nginx、Chrome、Redis Cluster)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved