IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++中的pimpl用法(Pointer to Implementation) -> 正文阅读

[C++知识库]C++中的pimpl用法(Pointer to Implementation)

定义

一种C++的编程手法,一方面可以减少编译依赖,对于大工程来说可以减少编译时间,一方面对于库来说可以减少私有成员的暴露,减少风险。

demo

// student.h
class Student
{
	Student(int age, string name, int sex);
	~Student();
	string show();
private:
	int m_age;
	string m_name;
	int m_sex;
}
// student.cpp
string Student::show(){return m_name;};
Student::Student(int age, string name, int sex):m_age(age),\
m_name(name), m_sex(sex){};

上面是一个学生类的定义和实现,现在如果想用这个学生类的有school.h , teacher.h, parent.h三个头文件使用,我们可以看到,一旦动了学生类,那么依赖的这三个类都要重新编译。

优化

// student.h
class StudentImpl;
class Student
{
	Student(int age, string name, int sex);
	~Student();
	string show();
private:
	shared_ptr<StudentImpl> m_student;
 }
// student.cpp
class StudentImpl
{
StudentImpl(int age, string name, int sex);
~StudentImpl();
string name(){return m_name;};

private:
	int m_age;
	string m_name;
	int m_sex;
}
StudentImpl::StudentImpl(int age, string name, int sex):m_age(age),m_name(name), m_sex(sex){};


Student::Student(int age, string name, int sex)
{
   m_student = make_shared<StudentImpl>(age,name,sex);
};
string Student::show(){return student->name();};

这样的话,你就是student.cpp改翻天,也不影响school.h , teacher.h, parent.h,因为他们理论来说编译的时候不依赖StudentImpl,这样在大型项目中,就可以加快编译速度,此外如果代码是提供对外的库比如opencv,一般会给一个头文件和so, 这里会有一个student.h,可是student.so外人压根不知道这个类的私有成员是啥,你也很难推出库函数的逻辑,保护了算法和知识产权。

paddle案例

位置:paddle/fluid/memory/allocation/thread_local_alloctor.h

class ThreadLocalAllocatorImpl;

class ThreadLocalAllocation : public Allocation {
 public:
  ThreadLocalAllocation(void* ptr, size_t size, platform::Place place)
      : Allocation(ptr, size, place) {}

  void SetThreadLocalAllocatorImpl(
      std::shared_ptr<ThreadLocalAllocatorImpl> allocator) {
    allocator_ = allocator;
  }  //给impl指针赋值

  std::shared_ptr<ThreadLocalAllocatorImpl> GetAllocator() {
    return allocator_;
  } //获取impl指针

 private:
  std::shared_ptr<ThreadLocalAllocatorImpl> allocator_;
};

class ThreadLocalAllocatorImpl
    : public std::enable_shared_from_this<ThreadLocalAllocatorImpl> {
 public:
  ThreadLocalAllocatorImpl(Place& p);
  ThreadLocalAllocation* AllocateImpl(size_t size);//不要觉得奇怪,一个类可以在自己内部声明一个指针的,这里可以理解为AllocateImpl是在ThreadLocalAllocation类中。
  void FreeImpl(ThreadLocalAllocation* allocation);//理解同上
  uint64_t ReleaseImpl();

 private:
  unique_ptr<BuddyAllocator> buddy_allocator_;//理解在ThreadLocalAllocation类中。
  Place place_;//同上
};

上面这段代码是抽取一个allocator相关代码,整个库中有非常非常多的这种,但是有个问题是ThreadLocalAllocatorImpl和ThreadLocalAllocator在一个文件中,正确的写法是ThreadLocalAllocatorImpl应该在thread_local_alloctor.cpp,如果按当下的写法一旦改变private成员,依赖这个thread_local_alloctor.h的文件都会重新编译,所以这个IMPL的意义是什么?是有什么高深的用法吗?不知道是大佬写错了还是我会错意了,希望懂得大神能留言解释一下。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-25 12:01:58  更:2021-08-25 12:04:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/27 6:42:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计