当前位置: 首页 > news >正文

做网站必须需要服务器嘛常用于做网站的软件

做网站必须需要服务器嘛,常用于做网站的软件,在哪个网站做流程图比较好看,用网站源码怎么做网站条款 44:将与参数无关的代码抽离模板 模板可以节省时间和避免代码重复,编译器会为填入的每个不同模板参数具现化出一份对应的代码,但长此以外,可能会造成代码膨胀(code bloat),生成浮夸的二进制…

条款 44:将与参数无关的代码抽离模板

模板可以节省时间和避免代码重复,编译器会为填入的每个不同模板参数具现化出一份对应的代码,但长此以外,可能会造成代码膨胀(code bloat),生成浮夸的二进制目标码。

基于共性和变性分析(commonality and variability analysis) 的方法,我们需要分析模板中重复使用的部分,将其抽离出模板,以减轻模板具现化带来的代码量。

  • 因非类型模板参数而造成的代码膨胀,往往可以消除,做法是以函数参数或类成员变量替换模板参数。
  • 因类型模板参数而造成的代码膨胀,往往可以降低,做法是让带有完全相同二进制表述的具现类型共享实现代码。

参考以下矩阵类的例子:

template<typename T, std::size_t n>
class SquareMatrix {
public:void Invert();...
private:std::array<T, n * n> data;
};

修改为:

template<typename T>
class SquareMatrixBase {
protected:void Invert(std::size_t matrixSize);...
private:std::array<T, n * n> data;
};template<typename T, std::size_t n>
class SquareMatrix : private SquareMatrixBase<T> {  // private 继承实现,见条款 39using SquareMatrixBase<T>::Invert;              // 避免掩盖基类函数,见条款 33public:void Invert() { this->Invert(n); }              // 调用模板基类函数,见条款 43...
};

Invert并不是我们唯一要使用的矩阵操作函数,而且每次都往基类传递矩阵尺寸显得太过繁琐,我们可以考虑将数据放在派生类中,在基类中储存指针和矩阵尺寸。修改代码如下:

template<typename T>
class SquareMatrixBase {
protected:SquareMatrixBase(std::size_t n, T* pMem): size(n), pData(pMem) {}void SetDataPtr(T* ptr) { pData = ptr; }...
private:std::size_t size;T* pData;
};template<typename T, std::size_t n>
class SquareMatrix : private SquareMatrixBase<T> {
public:SquareMatrix() : SquareMatrixBase<T>(n, data.data()) {}...
private:std::array<T, n * n> data;
};

然而这种做法并非永远能取得优势,硬是绑着矩阵尺寸的那个版本,有可能生成比共享版本更佳的代码。例如在尺寸专属版中,尺寸是个编译期常量,因此可以在编译期藉由常量的广传达到最优化;而在共享版本中,不同大小的矩阵只拥有单一版本的函数,可减少可执行文件大小,也就因此降低程序的 working set(在“虚内存环境”下执行的进程所使用的一组内存页),并强化指令高速缓存区内的引用集中化(locality of reference),这些都可能使程序执行得更快速。究竟哪个版本更佳,只能经由具体的测试后决定。

同样地,上面的代码也使用到了牺牲封装性的protected,可能会导致资源管理上的混乱和复杂,考虑到这些,也许一点点模板代码的重复并非不可接受。

条款 45:运用成员函数模板接受所有兼容类型

C++ 视模板类的不同具现体为完全不同的的类型(如果用带有base-derived关系的B、D分别具现化同一个template,产生出来的两个具现体并不带有base-derived关系),但在泛型编程中,我们可能需要一个模板类的不同具现体能够相互类型转换。

考虑设计一个智能指针类,而智能指针需要支持不同类型指针之间的隐式转换(如果可以的话),以及普通指针到智能指针的显式转换。很显然,我们需要的是模板拷贝构造函数(成员函数模板):

template<typename T>
class SmartPtr {
public:template<typename U>SmartPtr(const SmartPtr<U>& other): heldPtr(other.get()) { ... }template<typename U>explicit SmartPtr(U* p): heldPtr(p) { ... }T* get() const { return heldPtr; }...
private:T* heldPtr;
};

使用get获取原始指针,并将在原始指针之间进行类型转换本身提供了一种保障,如果原始指针之间不能隐式转换,那么其对应的智能指针之间的隐式转换会造成编译错误。

智能指针中的shared_ptr支持所有“兼容的内置指针、shared_ptr、auto_ptr和weak_ptr”的构造方法;以及上述除weak_ptr外的其它的赋值操作。(auto_ptr未被声明为const,是因为当你复制一个auto_ptr时,它其实被改动了)

template<class T>
class shared_ptr
{
public:template<class Y>explicit shared_ptr(Y* p);template<class Y>shared_ptr(shared_ptr<Y> const& r);template<class Y>explicit shared_ptr(weak_ptr<Y> const& r);template<class Y>explicit shared_ptr(auto_ptr<Y> & r);template<class Y>shared_ptr& operator=(shared_ptr<Y> const& r);template<class Y>shared_ptr& operator=(auto<Y> & r);
}

模板构造函数并不会阻止编译器暗自生成默认的构造函数,所以如果你想要控制拷贝构造的方方面面,你必须同时声明泛化拷贝构造函数和普通拷贝构造函数,相同规则也适用于赋值运算符:

template<typename T>
class shared_ptr {
public:shared_ptr(shared_ptr const& r);                // 拷贝构造函数template<typename Y>shared_ptr(shared_ptr<Y> const& r);             // 泛化拷贝构造函数shared_ptr& operator=(shared_ptr const& r);     // 拷贝赋值运算符template<typename Y>shared_ptr& operator=(shared_ptr<Y> const& r);  // 泛化拷贝赋值运算符...
};
http://www.yayakq.cn/news/567683/

相关文章:

  • 做网站项目计划书辽阳建设银行网站
  • 爱用建站怎么样安顺高端网站建设平台
  • 帮别人做网站维护违法小程序开发助手
  • 下载了网站源码番禺人才网招聘网官网最新招聘
  • 国外做的好的电商网站推荐织梦cms发布侵权网站清单
  • 有域名之后怎么自己做网站中国大数据公司排名10强
  • 城市建设最好的网站郑州seo服务技术
  • 合肥知名网站制作公司昆明网站建设推广服务
  • 乌当区城乡建设局网站做外贸网站要什么条件
  • html5网站建设公司哪些网站做农产品电子商务
  • 电子商务网站建设实训报告范文网站怎么自己做服务器
  • 网站建设视频教程。网站可以做弹窗广告么
  • 站长工具app下载谢岗东莞网站建设
  • 怎么看一个网站是否被k做美足网站违法吗
  • 重庆网站seo多少钱python创建网站
  • 个人备案网站用于企业简单的管理系统有哪些
  • 网站seo去哪个网站找好学室内设计学费大概要多少钱
  • 网站正在建设中英文表述求一个免费的
  • 湖北交投建设集团网站网站免费做招生宣传
  • 中英语网站制作方法wordpress教程创建网页
  • 学做衣服网站wordpress自建表格
  • 国家企业公司网站建设dw可以做wordpress
  • 大学生网站建设结题报告原画零基础自学
  • dz系统怎么做地方网站唐山网站建设
  • 福田网站建设标准数据手机网站怎么做微信登陆
  • 成都网站建设怎么做网站赚钱放广告
  • 影视传媒广告公司网站模板网站建设建设哪家便宜
  • 织梦汽车网站模板免费下载wordpress修改固定连接404
  • 上海长宁区网站建设wordpress 添加评论等级
  • 郑州网站建设咨询wordpress linux 静态