青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

醬壇子

專注C++技術(shù) 在這里寫下自己的學習心得 感悟 和大家討論 共同進步(歡迎批評!!!)

  C++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
  66 Posts :: 16 Stories :: 236 Comments :: 0 Trackbacks

公告

王一偉 湖南商學院畢業(yè) 電子信息工程專業(yè)

常用鏈接

留言簿(19)

我參與的團隊

搜索

  •  

積分與排名

  • 積分 - 390072
  • 排名 - 64

最新隨筆

最新評論

閱讀排行榜

評論排行榜

The PIMPL idiom

In C++ when anything in a header file changes, all code that includes the header (either directly or indirectly) must be recompiled. To minimalize this we use PIMPL idiom:

// file x.h
class X
{
public:
// public members
protected:
// protected members
private:
// pointer to forward declared class
class XImpl *pimpl_;  // opaque pointer
};

Questions: -- What should go into XImpl? Options are:

  • Put all private data but not functions into XImpl.: Not too bad, but there is better

  • Put all private members into XImpl.

  • Put all private and protected members into XImpl. Bad, protected members must be in X

  • Make XImpl entirely the class that X would have been, and write X as only the public interface made up entirely of simple forwarding functions (handle/body variant).

-- Does XImpl require a pointer back to the X object?

Caveats:

  • You can't hide virtual member functions in the Pimpl (here private inheritance differs from membership)

  • Functions in Pimpl may require a "back pointer" to the visible object (by convention that is called: self_.

  • Often the best compromise is to use Option 2, and in addition to put into XImpl only rhose non-private functions that need to be called by private ones.

  • 4th is better over 2nd not needed "back pointer", but X is useless for inheritance.

PIPML has some drawbacks, like allocating/deallocating objects in the heap, which could be slow.

What about this "optimalization"?

// file: y.h
class Y
{
//...
static const size_t sizeofx = /* ... */;
char x_[sizeofx];
};
// file: y.cpp
#include "x.h"
Y::Y()
{
assert( sizeofx >= sizeof(X) );
new(&x_[0]) X;
}
Y::~Y()
{
(reinterpret_cast<X*>(&x_[0]))->~X();
}

Questions:

  • What is the Pimpl space overhead?

  • What is the performance overhead?

Space overhead:

#include <iostream>
using namespace std;
struct X {
char c;
struct XImpl *pimpl_;
};
struct XImpl { char c; };
int main()
{
cout << sizeof(XImpl) << '\t' << sizeof(X) << endl;
return 0;
}
// result: 1    8

Runtime overhead:

  • allocation/deallocation cost: relativelly expensive

  • indirect access of private members (+ back pointer)

  • alignment problems: new guaranties, that object will align properly, char[] buffers doesn't!

  • X must not use the default assignmentoperator=()

  • If sizeof(XImpl) grows greater then sizeofx, we need to update the source.

// file x.h
class X
{
//...
struct XImpl *pimpl_;
};
// file x.cpp
#include "x.h"
struct XImpl
{
// private stuff here ...
static void *operator new(size_t)   { /*...*/ }
static void *operator delete(void*) { /*...*/ }
};
X::X() : pimpl_( new XImpl ) { }
X::~X() { delete pimpl_; pimpl_ = 0; }
posted on 2007-07-16 14:51 @王一偉 閱讀(1329) 評論(0)  編輯 收藏 引用

只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲天堂成人| 午夜欧美精品久久久久久久| 猛男gaygay欧美视频| 久久av免费一区| 国产曰批免费观看久久久| 久久精品日产第一区二区| 日韩视频一区| 日韩午夜在线视频| 国产精品久久一卡二卡| 久久精品国产77777蜜臀| 欧美在线视频在线播放完整版免费观看 | 亚洲第一中文字幕在线观看| 欧美国产91| 欧美日韩一区三区四区| 欧美专区日韩专区| 久久一区中文字幕| 中文精品视频| 久久国产精品毛片| 日韩一级黄色片| 亚洲欧美在线高清| 亚洲日本中文| 午夜一区二区三区在线观看| 亚洲国产精品久久久久| 99国产精品久久久久老师| 国产日本精品| 亚洲精品免费在线观看| 国产麻豆日韩欧美久久| 亚洲高清av| 国产午夜精品久久久久久久| 亚洲激情一区| 国产一区二区三区视频在线观看| 欧美成年人视频网站欧美| 欧美日韩一区在线播放| 欧美**人妖| 国产精品综合色区在线观看| 亚洲黄色成人| 狠狠色丁香婷婷综合| 一本综合精品| 亚洲美女在线国产| 久久久久久夜| 久久精品国产第一区二区三区最新章节 | 麻豆freexxxx性91精品| 欧美亚洲日本网站| 欧美人与禽性xxxxx杂性| 免费久久99精品国产| 国产欧美日本| 一区二区三区国产在线观看| 最新精品在线| 乱中年女人伦av一区二区| 久久国产视频网| 国产精品视频| 亚洲私人影吧| 亚洲一区精品在线| 欧美日韩美女在线| 亚洲精品视频在线| 亚洲精品日韩激情在线电影| 亚洲欧美国产日韩中文字幕| 噜噜噜躁狠狠躁狠狠精品视频 | 亚洲日本aⅴ片在线观看香蕉| 午夜视频在线观看一区二区| 性18欧美另类| 国产精品久久久久三级| 一区二区免费在线播放| 亚洲视频一区在线| 欧美日韩1区2区| 99re在线精品| 亚洲综合另类| 国产精品欧美日韩一区二区| 亚洲一区二区在线播放| 亚洲男同1069视频| 国产精品综合久久久| 欧美一区二区高清| 猛干欧美女孩| 亚洲欧洲精品一区二区| 欧美日韩国产色视频| 日韩视频一区二区三区| 亚洲制服av| 国产亚洲一区在线播放| 久久久久久久久综合| 欧美激情视频在线免费观看 欧美视频免费一| 在线观看欧美亚洲| 欧美激情1区2区| 一区二区av在线| 久久福利毛片| 亚洲国产高清自拍| 欧美日韩在线大尺度| 亚洲欧美日韩在线一区| 美女诱惑一区| 亚洲最新合集| 国产女主播一区二区| 久久久亚洲一区| 日韩一级免费| 久久久久综合| 一本久道久久久| 国产欧美日韩综合| 免费观看在线综合| 亚洲线精品一区二区三区八戒| 欧美一区二区视频观看视频| 亚洲第一页在线| 国产精品豆花视频| 久久久亚洲综合| 一区二区精品在线| 欧美 日韩 国产精品免费观看| 极品av少妇一区二区| 欧美日韩国产精品一区二区亚洲| 香蕉av777xxx色综合一区| 亚洲国产成人久久综合一区| 亚洲欧美综合国产精品一区| 在线高清一区| 国产精品亚洲综合| 欧美精品免费观看二区| 久久av红桃一区二区小说| 亚洲国产精品一区二区www在线| 亚洲欧美国产高清va在线播| 在线不卡a资源高清| 欧美午夜一区二区福利视频| 美女图片一区二区| 久久精品91久久久久久再现| 一区在线观看| 国产精品裸体一区二区三区| 欧美激情欧美激情在线五月| 欧美一区二区免费观在线| 99re6热在线精品视频播放速度| 美女视频黄 久久| 午夜精品久久99蜜桃的功能介绍| 亚洲国产精品精华液网站| 国产日韩一区二区三区在线| 欧美午夜精品久久久久免费视| 久久中文字幕一区| 久久精品国产亚洲高清剧情介绍| 日韩亚洲欧美综合| 亚洲国产一区二区三区a毛片| 久久人人爽爽爽人久久久| 亚洲欧美制服中文字幕| 亚洲午夜精品久久久久久app| 日韩视频一区| 最新高清无码专区| 亚洲经典在线| 亚洲国产成人高清精品| 在线精品观看| 亚洲高清在线观看一区| 在线播放中文一区| 樱桃国产成人精品视频| 国模 一区 二区 三区| 国产乱肥老妇国产一区二 | 欧美电影在线免费观看网站| 久久免费视频观看| 免费成年人欧美视频| 免费高清在线视频一区·| 老司机一区二区三区| 蜜桃av噜噜一区二区三区| 久久影院午夜论| 欧美高清不卡| 欧美色视频在线| 国产精品综合网站| 国产一区日韩一区| 在线观看成人av电影| 亚洲狠狠丁香婷婷综合久久久| 亚洲高清免费| 一区二区三区视频在线| 亚洲一区二区三区在线| 性欧美xxxx视频在线观看| 久久精品国产亚洲a| 蜜臀久久99精品久久久久久9| 欧美国产在线电影| 99re6热在线精品视频播放速度| 亚洲天堂成人| 久久久久国产精品午夜一区| 蜜臀av国产精品久久久久| 欧美极品一区二区三区| 国产精品乱码一区二三区小蝌蚪| 国产午夜精品美女视频明星a级| 在线播放不卡| 亚洲综合电影一区二区三区| 久久美女性网| 亚洲看片免费| 欧美怡红院视频一区二区三区| 老牛影视一区二区三区| 欧美少妇一区| 亚洲第一精品夜夜躁人人躁| 日韩一区二区精品葵司在线| 欧美在线播放| 亚洲精品1区2区| 欧美一区国产二区| 欧美日韩国产一区精品一区| 国产综合久久久久久| 亚洲深夜av| 免费在线看成人av| 亚洲一区二区免费看| 亚洲永久免费| 欧美国产一区二区三区激情无套| 一二三四社区欧美黄| 蜜桃av一区| 国产一区二区高清不卡| 亚洲视频在线二区| 欧美激情亚洲国产| 久久av一区二区三区亚洲| 欧美日韩国产二区| 91久久久久久久久久久久久| 久久久噜噜噜久久狠狠50岁|