热门关键词:

奇怪的重复模板模式(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

软件开发  相关内容

——
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…… [了解更多]

02

2019-08

app开发公司的软件设计的迭代器模式

迭代器模式是一种相对简单且经常使用的设计模式。每种语言都有很多数据结构/集合。每个集合都必须提供一个迭代器,让迭代器遍历其对象。但是,在执行此操作时,应确保它不会公开其实现。假设我们正在构建一个需要我们维护通知列表的应用程序。最终,您的代码的某些部分将需要迭代所有通知。如果我们将… [了解更多]

03

2019-07

纪念差一点改变世界的coreseek的错

Coreseek 是一款中文全文检索/搜索软件,以GPLv2许可协议开源发布,基于Sphinx研发并独立发布,专攻中文搜索和信息处理领域,适用于行业/垂直搜索、论坛/站内搜索、数据库搜索、文档/文献检索、信息检索、数据挖掘等应用场景,用户可以免费下载使用整理了coreseek/s… [了解更多]

24

2019-06

软件开发如何防止反射,序列化和克隆的单例

反射: 可以导致反射破坏单例类的单例属性,如下例所示:filter_none编辑play_arrowbrightness_4// Java code to explain effect of Reflection// on Singleton propertyimport jav…… [了解更多]

关注

成都软件开发

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