pImp機制 隱藏實現減小標頭檔案依賴

2021-07-16 13:19:30 字數 1638 閱讀 9104

pimp是private implemention的縮寫。在c++中,當需要引用其他標頭檔案中定義的類、函式、變數時,需要在應用前將需要的標頭檔案包含到當前的檔案中。如,

[cpp]view plain

copy

//標頭檔案"a.h"

#pragma once

class

a    

[cpp]view plain

copy

//標頭檔案"b.h"

#pragma once

#include "a.h"

class

b    

在編譯標頭檔案"b.h"時,編譯器首先需要變以標頭檔案"a.h",因為類b依賴類a,只有知道類a的構成之後,編譯器才能確定類b物件的結構,才能夠為b物件分配記憶體。假如類a的標頭檔案發生了變化,那在編譯時,類b也必須進行重新編譯。而進一步假設類b也 以同樣的方式被類c引用,類c又被類d引用...,那標頭檔案"a.h"的改變會導致所有類的重新編譯,這樣會大大增加增加編譯時間。對於乙個大型專案而言,有時是不可接受的。因此在實際程式設計中,需要減小標頭檔案之間的依賴關係,這也就是這裡的pimp機制。

此處,我們將"b.h"修改為如下:

[cpp]view plain

copy

//標頭檔案"b.h"

#pragma once

class

a;  

class

b    

這樣一來,編譯器就無需知道類a的具體結構即可確定類b物件的記憶體結構了,因為此處成員變數"a"只佔是乙個指標,在32位系統上只佔4個位元組,它的大小與類a沒有關係。所以當頭檔案"a.h"改變時,便只需要對"a.h"進行重新編譯即可,而"b.h"無需重新編譯。

除了這種標頭檔案之間的pimp,在單個類中也可以使用這種思想,例如,假設我們有如下類:

[cpp]view plain

copy

//標頭檔案"a.h"

#pragma once

class

a  ;  

inner innermember;  

};  

以上類a中,有乙個內部類inner,假如過了一段時間,由於新的需求,需要對inner類進行修改,這便會導致所有依賴標頭檔案"a.h"的標頭檔案全部需要重新編譯。為了避免這種依賴,這裡同樣可以使用pimp機制,在標頭檔案中宣告類inner,在cpp檔案中對inner類進行定義,建構函式中初始化成員指標innermember:

[cpp]view plain

copy

//標頭檔案"a.h"

#pragma once

class

a  ;  

[cpp]view plain

copy

//實現檔案"a.cpp"

class

a::inner  

a::a()    

當然,採用pimp機制會帶來額外的開銷,因為這種方式的成員需要利用new來動態分配記憶體。另外,也會容易造成記憶體洩露,而為了避免記憶體洩露,應該採用

raii機制,利用智慧型指標替代原始指標。    

交易安全 介面隱藏 前端實現結果輪詢機制

miaoshagoods do miaosha function checkpath success function data 獲取路徑 查詢訪問次數 5秒 5次 string url request.getrequesturi string key url user.getid integer ...

C 回顧 隱藏實現

一 c 的訪問控制 在任何關係中,設立相關各方面都遵從的邊界很重要。需要控制對結構成員的訪問有兩個理由 1 讓客戶程式設計師遠離一些他們不需要的工具 他們很容易知道什麼是重要的,什麼是可以忽略的 2 允許庫的設計者改變內部實現,而不必擔心會對客戶程式設計師產生影響。訪問控制通常是指實現細節的隱藏。p...

hashmap實現機制

int uint key.gethashcode 0x8ffffff 具體多少忘記了,總之就是把它弄成正數 int index uint map.length 把value放到那個 index位置。下次訪問時再通過 key的hashcode 0x8fffff 再 map.length 就知道valu...