跨程序共享記憶體 (如多進程計數器、Hook 共享資料) 需將變數置於**具名區段**並設定 **Read/Write/Share** 屬性。VC++ 使用 #pragma data_seg + #pragma comment(linker, "/SECTION:"),GCC 使用 __attribute__((section("name"))) + 連結器腳本。本文對比兩大編譯器完整實作細節、區段屬性設定、執行期驗證程式碼。
#include
#include
// 1. 告訴連結器:.shared 區段屬性為 Read/Write/Share (RWS)
#pragma comment(linker, "/SECTION:.shared,RWS")
// 2. 將後續資料導向 .shared 區段
#pragma data_seg(".shared")
int g_iShared = 0x37; // 共享變數,所有進程映射同一實體頁面
#pragma data_seg() // 恢復預設區段 (.data/.bss)
int main()
{
g_iShared = 200; // 修改共享變數
int iLocal = 300; // 區域變數 (棧上),各進程獨有
printf("Shared: %d, 0x%p\n", g_iShared, &g_iShared);
printf("Local : %d, 0x%p\n", iLocal, &iLocal);
return 0;
}
| 指令 | 作用 | |
|---|---|---|
#pragma comment(linker, "/SECTION:.shared,RWS") | 連結器指令:區段 .shared 具備 **R**ead、**W**rite、**S**hare (跨進程共享) 屬性。區段名不可為 .text/.data/.bss 等系統保留名。 | |
#pragma data_seg(".shared") | 編譯器指令:後續全域/靜態變數放入 .shared 區段。 | |
#pragma data_seg() | 恢復預設區段 (.data 初始化、.bss 未初始化)。 |
| 維度 | VC++ (MSVC) | GCC (MinGW/Linux) |
|---|---|---|
| 語法 | #pragma data_seg + #pragma comment(linker) | __attribute__((section)) |
| 區段屬性設定 | 連結器指令 /SECTION:name,RWS | 連結器腳本 / .def / 預設 (通常無共享屬性) |
| 跨進程共享支援 | **原生支援** (PE 區段 SHARED 屬性) | **無原生支援** (需 mmap/shm 手動映射) |
| 適用場景 | Windows Hook、多進程計數器、共享快取 | ELF 區段控制 (特殊段、嵌入式)、Linux 共享記憶體需用 shm |
| 可移植性 | Windows 專用 | 跨平台 (但共享語意不同) |
managed_shared_memory、shared_memory_object、mutex,C++ RAII 風格,Windows/Linux 通用。QSharedMemory + QSystemSemaphore。std::atomic_ref 配合共享記憶體映射 (仍需平台特定映射 API)。VC++ 以 #pragma data_seg + 連結器 /SECTION:RWS **原生支援**跨進程共享區段,語法簡單、效果可靠。GCC __attribute__((section)) 僅控制區段歸屬,**不提供共享屬性**,Linux 下必須改用 shm_open/mmap。跨平台專案強烈建議使用 **Boost.Interprocess** 封裝平台差異,獲得型別安全、RAII 管理、可移植的共享記憶體方案。