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

jsp网站开发难点北京的网站建设公司有哪些

jsp网站开发难点,北京的网站建设公司有哪些,全国seo公司排名,网站被黑了怎么办CRTP是 C 中的一种模板元编程技术,其核心原理是通过模板继承和静态多态,在编译期实现基类对派生类成员的访问,从而避免运行时虚函数调用的开销。 1. CRTP 的基本结构 CRTP 的核心思想是:基类是一个模板类,其模板参数…

CRTP是 C++ 中的一种模板元编程技术,其核心原理是通过模板继承静态多态,在编译期实现基类对派生类成员的访问,从而避免运行时虚函数调用的开销。

1. CRTP 的基本结构

CRTP 的核心思想是:基类是一个模板类,其模板参数是派生类本身

典型的代码如下:

template <typename Derived>
class Base {
public:void interface() {// 基类通过静态转换调用派生类的实现static_cast<Derived*>(this)->implementation();}
};class Derived : public Base<Derived> { // 派生类将自己作为模板参数传递给基类
public:void implementation() {// 派生类的具体实现}
};

2. CRTP 的核心原理

2.1 模板继承

       2.1.1基类模板化:基类 Base 接受派生类 Derived 作为模板参数

       2.1.2派生类继承基类模板:派生类继承时,将自己作为模板参数传递给基类,形成递归依赖(Derived : public Base<Derived>

2.2 静态多态

       2.2.1 编译期绑定:基类通过 static_cast<Derived*>(this) 将 this 指针转换为派生类类型,直接调用派生类的方法(如 implementation())。

       2.2.2 无虚函数开销:无需虚函数表(vtable),函数调用在编译期确定,无运行时间接跳转。

       2.2.3 代码复用与扩展:基类可定义通用逻辑(如 interface()),而具体实现由派生类提供(如 implementation())。新增派生类时,只需实现特定方法,无需修改基类。

3 CRTP 的工作流程

       3.1模板实例化:当定义 Derived 类时,基类 Base<Derived> 被实例化,生成针对 Derived 的基类代码

       3.2方法调用:调用 Base<Derived>::interface() 时,通过 static_cast 将基类指针安全转换为派生类指针,直接调用 Derived::implementation()

  3.3编译期解析:所有类型转换和函数绑定在编译期完成,生成高效代码

4 CRTP示例

#include <iostream>
using namespace std;// 定义一个模板基类,接受派生类作为参数
template<typename T>
class Animal {
public:void sound() {// static_cast到派生类类型,调用派生类的soundImpl()cout << "Animal::sound" <<endl;static_cast<T*>(this)->soundImpl();}
};// 具体的狗类,继承自Animal<Dog>
class Dog : public Animal<Dog> {   
public:// 具体实现狗的叫声void soundImpl() {cout << "Woof!" << endl;}
};// 具体的猫类,继承自Animal<Cat>
class Cat : public Animal<Cat> {    
public:void soundImpl() {cout << "Meow!" << endl;}
};int main() {// 创建一个Dog对象,调用sound()Animal<Dog> dog;dog.sound(); // 输出 Woof!// 创建一个Cat对象,调用sound()Animal<Cat> cat;cat.sound(); // 输出 Meow!return 0;
}//运行结果:
//Animal::sound
//Woof!
//Animal::sound
//Meow!

4.1汇编分析:

.LC0:.string "Woof!"
Dog::soundImpl():push    rbpmov     rbp, rspsub     rsp, 16mov     QWORD PTR [rbp-8], rdimov     esi, OFFSET FLAT:.LC0mov     edi, OFFSET FLAT:std::coutcall    std::basic_ostream<char, std::char_traits<char>>& std::operator<<<std::char_traits<char>>(std::basic_ostream<char, std::char_traits<char>>&, char const*)mov     esi, OFFSET FLAT:std::basic_ostream<char, std::char_traits<char>>& std::endl<char, std::char_traits<char>>(std::basic_ostream<char, std::char_traits<char>>&)mov     rdi, raxcall    std::ostream::operator<<(std::ostream& (*)(std::ostream&))nopleaveret
.LC1:.string "Meow!"
Cat::soundImpl():push    rbpmov     rbp, rspsub     rsp, 16mov     QWORD PTR [rbp-8], rdimov     esi, OFFSET FLAT:.LC1mov     edi, OFFSET FLAT:std::coutcall    std::basic_ostream<char, std::char_traits<char>>& std::operator<<<std::char_traits<char>>(std::basic_ostream<char, std::char_traits<char>>&, char const*)mov     esi, OFFSET FLAT:std::basic_ostream<char, std::char_traits<char>>& std::endl<char, std::char_traits<char>>(std::basic_ostream<char, std::char_traits<char>>&)mov     rdi, raxcall    std::ostream::operator<<(std::ostream& (*)(std::ostream&))nopleaveret
main:push    rbpmov     rbp, rspsub     rsp, 16lea     rax, [rbp-1]mov     rdi, raxcall    Animal<Dog>::sound() lea     rax, [rbp-2]mov     rdi, raxcall    Animal<Cat>::sound()mov     eax, 0leaveret
.LC2:.string "Animal::sound"
Animal<Dog>::sound():push    rbpmov     rbp, rspsub     rsp, 16mov     QWORD PTR [rbp-8], rdimov     esi, OFFSET FLAT:.LC2mov     edi, OFFSET FLAT:std::coutcall    std::basic_ostream<char, std::char_traits<char>>& std::operator<<<std::char_traits<char>>(std::basic_ostream<char, std::char_traits<char>>&, char const*)mov     esi, OFFSET FLAT:std::basic_ostream<char, std::char_traits<char>>& std::endl<char, std::char_traits<char>>(std::basic_ostream<char, std::char_traits<char>>&)mov     rdi, raxcall    std::ostream::operator<<(std::ostream& (*)(std::ostream&))mov     rax, QWORD PTR [rbp-8]mov     rdi, raxcall    Dog::soundImpl()nopleaveret
Animal<Cat>::sound():push    rbpmov     rbp, rspsub     rsp, 16mov     QWORD PTR [rbp-8], rdimov     esi, OFFSET FLAT:.LC2mov     edi, OFFSET FLAT:std::coutcall    std::basic_ostream<char, std::char_traits<char>>& std::operator<<<std::char_traits<char>>(std::basic_ostream<char, std::char_traits<char>>&, char const*)mov     esi, OFFSET FLAT:std::basic_ostream<char, std::char_traits<char>>& std::endl<char, std::char_traits<char>>(std::basic_ostream<char, std::char_traits<char>>&)mov     rdi, raxcall    std::ostream::operator<<(std::ostream& (*)(std::ostream&))mov     rax, QWORD PTR [rbp-8]mov     rdi, raxcall    Cat::soundImpl()nopleaveret

重点关注一下main函数中对sound的调用

lea rax, [rbp-1]            ; 对象地址
mov rdi, rax
call Dog::sound()           ; 直接调用

5 同样的功能,用动态多态实现

class Animal
{
public:virtual void sound(){cout << "Animal::sound" <<endl;}
};class Dog : public Animal
{virtual void sound(){cout << "Woof!"  << endl;}
};class Cat: public Animal
{virtual void sound(){cout << "Meow!"  << endl;}
};int main() {Animal* animal1 = new Dog();animal1->sound();Animal* animal2 = new Cat();animal2->sound();return 0;
}//程序运行结果:
//Woof!
//Meow!

对应的汇编:

.LC0:.string "Animal::sound"
Animal::sound():push    rbpmov     rbp, rspsub     rsp, 16mov     QWORD PTR [rbp-8], rdimov     esi, OFFSET FLAT:.LC0mov     edi, OFFSET FLAT:std::coutcall    std::basic_ostream<char, std::char_traits<char>>& std::operator<<<std::char_traits<char>>(std::basic_ostream<char, std::char_traits<char>>&, char const*)mov     esi, OFFSET FLAT:std::basic_ostream<char, std::char_traits<char>>& std::endl<char, std::char_traits<char>>(std::basic_ostream<char, std::char_traits<char>>&)mov     rdi, raxcall    std::ostream::operator<<(std::ostream& (*)(std::ostream&))nopleaveret
.LC1:.string "Woof!"
Dog::sound():push    rbpmov     rbp, rspsub     rsp, 16mov     QWORD PTR [rbp-8], rdimov     esi, OFFSET FLAT:.LC1mov     edi, OFFSET FLAT:std::coutcall    std::basic_ostream<char, std::char_traits<char>>& std::operator<<<std::char_traits<char>>(std::basic_ostream<char, std::char_traits<char>>&, char const*)mov     esi, OFFSET FLAT:std::basic_ostream<char, std::char_traits<char>>& std::endl<char, std::char_traits<char>>(std::basic_ostream<char, std::char_traits<char>>&)mov     rdi, raxcall    std::ostream::operator<<(std::ostream& (*)(std::ostream&))nopleaveret
.LC2:.string "Meow!"
Cat::sound():push    rbpmov     rbp, rspsub     rsp, 16mov     QWORD PTR [rbp-8], rdimov     esi, OFFSET FLAT:.LC2mov     edi, OFFSET FLAT:std::coutcall    std::basic_ostream<char, std::char_traits<char>>& std::operator<<<std::char_traits<char>>(std::basic_ostream<char, std::char_traits<char>>&, char const*)mov     esi, OFFSET FLAT:std::basic_ostream<char, std::char_traits<char>>& std::endl<char, std::char_traits<char>>(std::basic_ostream<char, std::char_traits<char>>&)mov     rdi, raxcall    std::ostream::operator<<(std::ostream& (*)(std::ostream&))nopleaveret
Animal::Animal() [base object constructor]:push    rbpmov     rbp, rspmov     QWORD PTR [rbp-8], rdimov     edx, OFFSET FLAT:vtable for Animal+16mov     rax, QWORD PTR [rbp-8]mov     QWORD PTR [rax], rdxnoppop     rbpret
Dog::Dog() [base object constructor]:push    rbpmov     rbp, rspsub     rsp, 16mov     QWORD PTR [rbp-8], rdimov     rax, QWORD PTR [rbp-8]mov     rdi, raxcall    Animal::Animal() [base object constructor]mov     edx, OFFSET FLAT:vtable for Dog+16mov     rax, QWORD PTR [rbp-8]mov     QWORD PTR [rax], rdxnopleaveret
Cat::Cat() [base object constructor]:push    rbpmov     rbp, rspsub     rsp, 16mov     QWORD PTR [rbp-8], rdimov     rax, QWORD PTR [rbp-8]mov     rdi, raxcall    Animal::Animal() [base object constructor]mov     edx, OFFSET FLAT:vtable for Cat+16mov     rax, QWORD PTR [rbp-8]mov     QWORD PTR [rax], rdxnopleaveret
main:push    rbpmov     rbp, rsppush    rbxsub     rsp, 24mov     edi, 8call    operator new(unsigned long)mov     rbx, raxmov     QWORD PTR [rbx], 0mov     rdi, rbxcall    Dog::Dog() [complete object constructor]mov     QWORD PTR [rbp-24], rbxmov     rax, QWORD PTR [rbp-24]mov     rax, QWORD PTR [rax]mov     rdx, QWORD PTR [rax]mov     rax, QWORD PTR [rbp-24]mov     rdi, raxcall    rdxmov     edi, 8call    operator new(unsigned long)mov     rbx, raxmov     QWORD PTR [rbx], 0mov     rdi, rbxcall    Cat::Cat() [complete object constructor]mov     QWORD PTR [rbp-32], rbxmov     rax, QWORD PTR [rbp-32]mov     rax, QWORD PTR [rax]mov     rdx, QWORD PTR [rax]mov     rax, QWORD PTR [rbp-32]mov     rdi, raxcall    rdxmov     eax, 0mov     rbx, QWORD PTR [rbp-8]leaveret
vtable for Cat:.quad   0.quad   typeinfo for Cat.quad   Cat::sound()
vtable for Dog:.quad   0.quad   typeinfo for Dog.quad   Dog::sound()
vtable for Animal:.quad   0.quad   typeinfo for Animal.quad   Animal::sound()
typeinfo for Cat:.quad   vtable for __cxxabiv1::__si_class_type_info+16.quad   typeinfo name for Cat.quad   typeinfo for Animal
typeinfo name for Cat:.string "3Cat"
typeinfo for Dog:.quad   vtable for __cxxabiv1::__si_class_type_info+16.quad   typeinfo name for Dog.quad   typeinfo for Animal
typeinfo name for Dog:.string "3Dog"
typeinfo for Animal:.quad   vtable for __cxxabiv1::__class_type_info+16.quad   typeinfo name for Animal
typeinfo name for Animal:.string "6Animal"		

重点关注一下main函数中sound的调用过程

push    rbp             ; 保存旧的基址指针(rbp)
mov     rbp, rsp        ; 将当前栈指针(rsp)设为新的基址指针(rbp)
push    rbx             ; 保存rbx寄存器(被调用者保存寄存器)
sub     rsp, 24         ; 分配24字节栈空间(用于局部变量和对齐)mov     edi, 8          ; 参数:申请8字节内存(Dog对象的大小)
call    operator new(unsigned long)  ; 调用new运算符分配内存
mov     rbx, rax        ; 将返回的指针保存到rbx(rax存放new的返回值)
mov     QWORD PTR [rbx], 0  ; 将内存的前8字节置零(临时初始化虚表指针vptr)
mov     rdi, rbx        ; 将对象指针作为构造函数参数(this指针)
call    Dog::Dog() [complete object constructor]  ; 调用Dog构造函数
mov     QWORD PTR [rbp-24], rbx  ; 将构造后的Dog指针存入栈[rbp-24]//对应C++代码:
//Animal* dog = new Dog(); // 动态分配Dog对象//调用Dog对象的虚函数mov     rax, QWORD PTR [rbp-24]  ; 从栈中加载Dog对象指针到rax
mov     rax, QWORD PTR [rax]     ; 加载虚表指针vptr(Dog的虚表地址)
mov     rdx, QWORD PTR [rax]     ; 加载虚表第一个条目(即Dog::sound()地址)
mov     rax, QWORD PTR [rbp-24]  ; 再次加载Dog对象指针到rax
mov     rdi, rax                 ; 将对象指针作为this参数传递
call    rdx                      ; 通过虚表调用Dog::sound()//对应C++代码:
//dog->sound(); // 动态绑定到Dog::sound()

6 通过对比,关键差异总结如下:

特性动态多态(虚函数)静态多态(CRTP)
实现方式虚函数表 + 运行时间接调用模板继承 + 编译期绑定
内存开销每个对象需存储 vptr(通常8字节)无额外内存开销
性能函数调用需查表跳转(轻微性能损耗)直接调用(无额外开销)
灵活性支持运行时多态仅支持编译期多态
代码扩展性新增派生类无需修改基类需修改模板参数或继承关系
汇编特征虚表结构、vptr初始化、间接调用(call rdx直接函数调用(call Dog::sound()


文章转载自:

http://jfS5oS05.gfmpk.cn
http://DWb0SiyG.gfmpk.cn
http://5bEj4Nmo.gfmpk.cn
http://iDjn8iTB.gfmpk.cn
http://rH1l1RV0.gfmpk.cn
http://q8gomsAW.gfmpk.cn
http://gtAYzrvR.gfmpk.cn
http://lj8sPin9.gfmpk.cn
http://zKC0FLA9.gfmpk.cn
http://lSHO8PN7.gfmpk.cn
http://qEWwsmea.gfmpk.cn
http://EDMGfxzj.gfmpk.cn
http://X1Mvcoq9.gfmpk.cn
http://18PLuvk3.gfmpk.cn
http://POmugXza.gfmpk.cn
http://rXN4aifl.gfmpk.cn
http://Kvtfkl0d.gfmpk.cn
http://7F5eMldr.gfmpk.cn
http://F4nXHTJG.gfmpk.cn
http://iJstGmMj.gfmpk.cn
http://OdbhIXPo.gfmpk.cn
http://17orb1Oc.gfmpk.cn
http://GwWQflXK.gfmpk.cn
http://EBrL95iW.gfmpk.cn
http://2DWDfqPP.gfmpk.cn
http://UpBf3v4K.gfmpk.cn
http://6dYmWq4Y.gfmpk.cn
http://MztnImbH.gfmpk.cn
http://lEZjjKmn.gfmpk.cn
http://qsU7kOkU.gfmpk.cn
http://www.dtcms.com/wzjs/624009.html

相关文章:

  • 广州网站推广运营网站怎么做才能被百度抓取到
  • 百度做网站多少钱能做wordpress 微博】
  • 山东平台网站建设设计莱芜金点子2023最新招聘
  • 有谁有做卫生纸巾的网站重庆网站建设公司 十年
  • 网站开发实施方案wordpress怎么制作菜单
  • 建站推广营销技巧和营销方法心得
  • 网站建设有什么要求天猫网站的建设
  • 企业网站的价值体现是在网页设计中文本居中用什么代码
  • 纪检监察网站建设背景郑州网站建设鹏之信
  • 官方网站 建设情况汇报wordpress系统安装
  • 建筑模型网站网站设计学习机构
  • 怎么做同城购物网站怎样做网站宣传
  • 怎样做_网站做seo如何进行页面设计
  • 工程建设网站怎么提交广告策划书前言怎么写
  • 做seo网站 公司云县网站建设
  • 网站制作公司有哪些证个人备案网站描述
  • 石家庄建设工程信息网站网站开发的挑战
  • 软件二次开发南京整站优化
  • 做汽车商城网站百度网站关键词
  • 网站建设易网拓seo顾问招聘
  • 中国网站排名网站开发包括
  • 网站开发 岗位职责手机网站 布局
  • 域名和网站关联wordpress设置教程视频
  • 网站建设的价值体现在哪搞个app软件需要多少钱
  • 徐州品牌网站建设|徐州网站优化|徐州网络公司-徐州启思信息科技一个网站的优化怎么做
  • 网页制作免费网站建设访问wap网站
  • 福州网站建设营销q479185700刷屏公司网站制作设计价格
  • 第一推是谁做的网站贵阳快速建站模板
  • 重庆教育集团建设公司网站青岛设计网站公司
  • 做网站 徐州小学生信息科学做网站