C++ 对象模型
文章平均质量分 83
C++新经典 对象模型 王建伟编著——读书笔记
不是仙人的闲人
慢慢记录,慢慢更新。
展开
-
C++ 新经典:对象模型——目录(先留框架,慢慢来~)
C++ 新经典:对象模型——目录原创 2024-08-09 00:11:50 · 571 阅读 · 0 评论 -
C++ 对象——类对象所占用的空间
理解C++类对象的内存占用涉及多个因素,包括成员变量、内存对齐、虚函数表指针等。通过掌握这些原则,可以更好地设计和优化类的内存布局,从而提高程序的性能和效率。原创 2024-08-03 12:08:01 · 518 阅读 · 0 评论 -
C++ 对象——对象中的 this 指针调整
在多重继承中,一个对象可能同时包含多个基类的成员。`this` 指针的调整是为了确保在调用成员函数时,能够正确访问当前对象的基类部分。原创 2024-08-03 15:21:40 · 433 阅读 · 0 评论 -
C++ 对象——分析目标文件(.obj 或 .o 文件)
理解目标文件的结构和生成过程对于掌握 C++ 的编译和链接机制至关重要。使用 `dumpbin` 工具可以有效分析目标文件的内容,帮助开发者调试和优化程序。原创 2024-08-04 03:14:21 · 1349 阅读 · 0 评论 -
C++ 对象——构造函数语义
合成默认构造函数在 C++ 中是一个强大的特性,允许开发者在不显式定义构造函数的情况下,依然能够创建对象。原创 2024-08-04 03:16:30 · 1083 阅读 · 0 评论 -
C++ 对象——拷贝构造函数语义与移动构造函数语义
拷贝构造函数主要用于复制对象,编译器会在特定条件下自动生成,确保对象的成员正确复制。移动构造函数用于转移对象的资源,编译器的生成条件更为严格,主要依赖于类是否有自定义的拷贝相关函数和成员的可移动性。原创 2024-08-05 22:21:17 · 1239 阅读 · 0 评论 -
C++ 对象——程序转换语义
程序转换语义(Copy Elision)是指在特定情况下,编译器可以优化对象的复制和移动操作,直接在目标位置构造对象,而不是先在临时对象中构造,然后再移动或复制到目标位置。这种优化可以显著提高性能,减少不必要的资源开销。原创 2024-08-05 22:48:38 · 332 阅读 · 0 评论 -
C++ 对象——对象之成员初始化列表
成员初始化列表是在构造函数中用于初始化类成员的语法。它在构造函数体执行之前执行。原创 2024-08-06 20:59:33 · 916 阅读 · 0 评论 -
C++ 虚函数(周末改8.7)
虚函数表(VTable)是用于实现动态绑定的机制。每个含有虚函数的类都会有一个虚函数表,类的每个对象在内存中都会有一个指向该虚函数表的指针。,成员变量是跟着对象走的,也就是说是属于对象的。多重继承时,每个基类都会有自己的虚函数表指针。解释:虚函数表指针位于对象内存的起始位置。类重写了这两个虚函数并添加了一个新的虚函数。类的虚函数表分为两部分:一个部分是从。的虚函数表中的第一个函数指针指向。,所以第二个函数指针仍然指向。对象里有一个虚函数表指针。类还添加了一个新的虚函数。解释:在多重继承中,原创 2024-08-07 22:32:39 · 273 阅读 · 0 评论 -
C++ 数据语义学——数据成员绑定时机
在 C++ 中,成员函数的函数体解析是在整个类定义完毕之后进行的。这意味着在类的定义过程中,编译器会先解析类的所有成员声明,然后再解析成员函数的具体实现。这种方式确保了成员函数在解析时可以访问类的所有成员。// 定义一个类public:// 成员函数声明private:// 数据成员// 成员函数定义// 访问数据成员// 修改数据成员// 输出: Value: 42// 输出: Value: 100return 0;MyClass类的定义包括两个成员函数。原创 2024-08-07 23:05:11 · 631 阅读 · 0 评论 -
C++ 数据语义学——进程内存空间布局
当把一个可执行文件加载到内存后,就变成了一个进程。原创 2024-08-08 00:44:05 · 447 阅读 · 0 评论 -
C++ 数据语义学——数据成员布局
数据成员布局是指在内存中如何安排一个类或结构体的成员变量。它决定了每个成员变量在对象中的位置和顺序。数据成员布局的主要目的是优化内存访问效率和满足硬件对齐要求。原创 2024-08-08 00:47:51 · 502 阅读 · 0 评论 -
C++ 数据语义学——类数据成员的存取
在C++中,数据成员的存取是指对类的成员变量(即数据成员)进行读取和写入操作。原创 2024-08-09 00:14:35 · 264 阅读 · 0 评论 -
C++ 数据语义学——单类单继承虚函数下的数据成员布局
在单类单继承的情况下,虚函数的存在会影响数据成员的布局。虚函数表(vtable)和虚指针(vptr)是实现多态性的重要机制。原创 2024-08-10 00:23:58 · 430 阅读 · 0 评论 -
C++ 函数语义学——普通成员函数调用方式
调用成员函数最终的感觉相当于调用了一个全局函数,只不过这个全局函数隐式地接受一个指向对象实例的指针作为第一个参数。实际上,编译器内部会将对成员函数的调用转换成对全局函数的调用。原创 2024-08-10 00:47:14 · 350 阅读 · 0 评论 -
C++ 函数语义学——静态成员函数调用方式
1. 静态成员函数没有 `this` 指针,这是最重要的一点。2. 无法直接存取类中普通的非静态成员变量。3. 静态成员函数不能在末尾增加 `const` 后缀,也不能设置 `virtual`。4. 可以使用类对象来调用,但不要求一定要用类对象来调用。5. 静态成员函数等同于全局函数(非成员函数),所以一般提供回调函数的场合,可以将这种函数提供为回调函数。原创 2024-08-10 11:57:26 · 476 阅读 · 0 评论 -
C++ 函数语义学——虚函数调用机制与vcall thunk的深入解析
当通过基类指针或引用调用虚函数时,编译器会通过虚函数表找到实际要调用的函数地址。这种机制被称为虚函数调用(vcall)。原创 2024-08-10 13:57:15 · 413 阅读 · 0 评论 -
C++ 函数语义学——静动态类型、绑定、坑点与多态体现深谈
静动态类型、绑定、坑点与多态体现深谈原创 2024-08-10 14:00:06 · 920 阅读 · 0 评论 -
C++ 函数语义学——多继承与虚函数:深入理解与最佳实践
多继承下的虚函数:在多继承的情况下,子类可以重写多个基类的虚函数,通过基类指针调用虚函数时,会根据对象的动态类型调用子类的实现。删除用第二基类指针new出来的子类对象:基类的析构函数必须是虚函数,以确保通过基类指针删除对象时,调用的是子类的析构函数,正确销毁对象。非虚析构函数导致内存泄露:如果基类的析构函数不是虚函数,通过基类指针删除派生类对象时,只会调用基类的析构函数,而不会调用派生类的析构函数,可能导致派生类中的资源没有被正确释放,从而引发内存泄露。解决方法。原创 2024-08-11 17:35:45 · 971 阅读 · 0 评论 -
C++ 函数语义学——多继承与虚继承:虚函数机制深度解析
多继承下的虚函数支持:在多继承下,通过指向第二个基类的指针调用继承类的虚函数时,需要进行 this 指针的调整,以确保正确调用虚函数。虚继承下的虚函数:在虚继承下,虚函数的行为与普通继承类似,但需要注意 this 指针的调整,以确保正确调用虚函数。原创 2024-08-11 18:10:35 · 446 阅读 · 0 评论 -
C++ 函数语义学——RTTI(运行时类型识别)回顾与存储位置简介
RTTI(运行时类型识别)是C++提供的一种机制,用于在运行时识别对象的类型。原创 2024-08-12 00:23:10 · 649 阅读 · 0 评论 -
C++ 函数语义学——函数调用与继承关系性能
函数调用优化:编译器可以通过循环展开、循环合并和循环分裂等技术优化函数调用中的循环代码。继承关系深度:继承关系越深,构造和析构函数调用、成员变量初始化和函数调用的开销越大。虚函数开销:继承关系深度增加会导致虚函数表查找开销、缓存命中率降低和内存占用增加。原创 2024-08-12 00:23:44 · 355 阅读 · 0 评论 -
C++ 函数语义学——指向成员函数的指针和 vcall
- **不用类对象调用函数**:直接调用成员函数指针可能会导致未定义行为,特别是在涉及虚函数时,因为虚函数调用需要通过虚函数表(vtable)进行动态绑定。- **指向成员函数的指针**:指向成员函数的指针用于指向类的成员函数,可以通过对象和指针调用成员函数。- **指向虚成员函数的指针和 vcall**:指向虚成员函数的指针在调用时通过虚函数表进行动态绑定,实现多态性。- **vcall 在继承关系中的体现**:在继承关系中,虚函数调用通过虚函数表实现动态绑定,基类指针可以调用派生类的虚函数。原创 2024-08-12 17:15:41 · 1210 阅读 · 0 评论 -
C++ 函数语义学——inline 函数回顾和扩展
inline函数的优缺点inline函数可以提高执行效率,但可能导致代码膨胀。原创 2024-08-12 18:46:26 · 700 阅读 · 0 评论 -
C++ 对象构造语义学——继承体系下的对象构造
**对象构造顺序**:从父类到子类,从根源到末端。原创 2024-08-13 00:32:40 · 746 阅读 · 0 评论 -
C++ 对象构造语义学——对象复制语义与析构函数语义学
- **默认复制行为**:当程序员不自定义拷贝构造函数和拷贝赋值运算符时,编译器会提供默认的复制行为。- **拷贝构造函数与赋值运算符**:自定义这两个函数以实现深拷贝,避免资源共享问题。- **禁止拷贝**:使用 `delete` 或私有成员来禁止拷贝构造和赋值。- **析构函数合成与扩展**:理解析构函数的合成和扩展机制,以确保资源的正确管理和释放。原创 2024-08-13 00:33:17 · 795 阅读 · 0 评论 -
C++ 对象构造语义学——局部对象、全局对象的构造和析构
局部对象:在作用域内构造和析构,成员变量需显式初始化。全局对象:在程序启动和结束时构造和析构,成员变量默认初始化为0。原创 2024-08-13 19:58:06 · 334 阅读 · 0 评论 -
C++ 对象构造语义学——局部静态对象、对象数组构造和内存分配
局部静态对象和局部静态对象数组在内存分配和管理方面提供了高效的解决方案。局部静态对象在首次调用时构造并保持状态,析构函数在程序结束时调用,确保资源释放。局部静态对象数组则通过延迟分配和编译器优化,避免不必要的内存占用,提升了程序的性能和资源利用率。这种机制使得开发者能够灵活地使用大数组而不需在程序启动时占用大量内存,适应了现代编程的需求。原创 2024-08-13 19:58:58 · 438 阅读 · 0 评论 -
C++ 对象构造语义学——临时性对象的详细探讨
临时性对象在C++中是一个重要的概念,涉及到拷贝构造、拷贝赋值和运算符重载等。对于临时性对象的管理,理解其生命周期和性能影响是非常重要的,尤其是在涉及大量对象拷贝时。使用移动语义和返回值优化(RVO)可以减少不必要的拷贝,提高程序性能。原创 2024-08-14 08:49:27 · 1134 阅读 · 0 评论 -
C++ 模板实例化语义学——模板及其实例化详细分析
函数模板:提供了编写泛型函数的能力,编译器会根据使用的类型自动实例化。类模板:提供了编写泛型类的能力,每个实例化版本都是独立的,包括枚举类型和静态成员变量。多个源文件中的类模板:为了防止链接错误,通常将类模板的定义和实现放在同一个头文件中。- **虚函数的实例化**:每个实例化版本会有自己的虚函数表。- **显式实例化**:可以通过显式实例化来控制何时生成特定类型的实例化版本,有助于避免链接错误。原创 2024-08-15 09:13:04 · 593 阅读 · 0 评论