热门关键词:

奇怪的重复模板模式(CRTP)

添加时间:2019-09-05 15:44:21

来源:

浏览:

通过奇怪的重复模板模式(CRTP)可以完全避免使用VPtr和VTable。CRTP是C ++中的一种设计模式,其中类X派生自使用X本身作为模板参数的类模板实例化。更一般地,它被称为F结合多态性。

filter_none

编辑

play_arrow


brightness_4

// Image program (similar to above) to demonstrate 

// working of CRTP 

#include <iostream> 

#include <chrono> 

using namespace std; 

  

typedef std::chrono::high_resolution_clock Clock; 

  

// To store dimensions of an image 

class Dimension 

public: 

    Dimension(int _X, int _Y) 

    { 

        mX = _X; 

        mY = _Y; 

    } 

private: 

    int mX, mY; 

}; 

  

// Base class for all image types. The template 

// parameter T is used to know type of derived 

// class pointed by pointer. 

template <class T> 

class Image 

public: 

    void Draw() 

    { 

        // Dispatch call to exact type 

        static_cast<T*> (this)->Draw(); 

    } 

    Dimension GetDimensionInPixels() 

    { 

        // Dispatch call to exact type 

        static_cast<T*> (this)->GetDimensionInPixels(); 

    } 

  

protected: 

    int dimensionX, dimensionY; 

}; 

  

  

// For Tiff Images 

class TiffImage : public Image<TiffImage> 

public: 

    void Draw() 

    { 

        // Uncomment this to check method dispatch 

        // cout << "TiffImage::Draw() called" << endl; 

    } 

    Dimension GetDimensionInPixels() 

    { 

        return Dimension(dimensionX, dimensionY); 

    } 

}; 

  

// There can be more derived classes like PngImage, 

// BitmapImage, etc 

  

// Driver code 

int main() 

    // An Image type pointer pointing to Tiffimage 

    Image<TiffImage>* pImage = new TiffImage; 

  

    // Store time before virtual function calls 

    auto then = Clock::now(); 

  

    // Call Draw 1000 times to make sure performance 

    // is visible 

    for (int i = 0; i < 1000; ++i) 

        pImage->Draw(); 

  

    // Store time after virtual function calls 

    auto now = Clock::now(); 

  

    cout << "Time taken: "

         << std::chrono::duration_cast 

         <std::chrono::nanoseconds>(now - then).count() 

         << " nanoseconds" << endl; 

  

    return 0; 

输出:


所用时间:732纳秒

见这对上述结果。


虚拟方法与CRTP基准测试

使用虚拟方法所用的时间为2613纳秒。CRTP的这种(小)性能增益是因为绕过了VTable调度的使用。请注意,性能取决于许多因素,如使用的编译器,虚拟方法执行的操作。不同运行中的性能数字可能不同,但CRTP预计会有(小)性能提升。

注意:如果我们在CRTP中打印类的大小,可以看出VPtr不再保留4个字节的内存。


 

cout << sizeof(图片)<< endl; 


需要开发软件,app,管理系统,就找我们成都软件公司吧。

用户名 Name
评论 Comment

软件开发  相关内容

——
28

2019-10

软件工程之开发代理设计模式

代理也称为代理,句柄和包装器。它们在结构上与适配器和装饰器密切相关,但不是目的。现实世界中的例子可以是支票,也可以使用信用卡代替我们银行帐户中的内容。它可以代替现金,并在需要时提供一种获取现金的方法。而这正是代理模式的作用–“ 控制和管理对其所保护对象的访问 ”。行为与装饰器模式… [了解更多]

30

2019-09

软件开发的轻量化设计模式

Flyweight模式是结构设计模式之一,因为该模式提供了减少对象数量的方式,从而改善了应用程序所需的对象结构。当我们需要创建大量相似对象(例如10 5)时,将使用Flyweight模式。轻量级物体的一个重要特征是它们是 不可变的。这意味着一旦构建它们便无法对其进行修改。为什么我… [了解更多]

30

2019-09

某石油集团油气田公司信息报送系统

实现了公司信息报送系统的稳定高效运行;满足各二级单位和三级单位对信息报送平台的使用需求,有效提高了工作效率。主要功能有:用户基本信息管理、角色权限管理,部门管理,报送栏目管理,图片作者和文字作者管理,公告管理,菜单管理,配置管理、报送信息管理,审阅人权限设置,信息搜索,信息审核、… [了解更多]

05

2019-09

奇怪的重复模板模式(CRTP)

通过奇怪的重复模板模式(CRTP)可以完全避免使用VPtr和VTable。CRTP是C ++中的一种设计模式,其中类X派生自使用X本身作为模板参数的类模板实例化。更一般地,它被称为F结合多态性。filter_none编辑play_arrowbrightness_4// Image… [了解更多]

05

2019-09

软件设计奇怪的重复模板模式(CRTP)

建议将虚函数和运行时多态性作为先决条件。下面是一个演示运行时多态性的示例程序。filter_none编辑play_arrowbrightness_4// A simple C++ program to demonstrate run-time// polymorphism#inc…… [了解更多]

关注

成都软件开发

  • 地 址:成都市人民南路四段成科西路三号 863国家孵化园
  • 电 话:18215 660330
  • 手机:18215 660330
  • 传 真:18215 660330
  • 邮 箱:179001057@qq.com
  • 邮政编码:610000