C++
文章平均质量分 89
TrustZone_
一个搞技术的读书人,妄图分享最干货的技术知识与世界运转的底层逻辑。公ZH:TrustZone
展开
-
面试真题 | 小红书-C++引擎架构
在C++中,多态性是一种重要的特性,它允许通过基类指针或引用来调用派生类中的函数。多态性主要分为两种:编译时多态(主要通过函数重载和模板实现)和运行时多态(主要通过虚函数实现)。关于您提到的“C++多态,如何实现的,虚表、虚表指针存储位置”,以下是详细解释和可能的面试官追问。B树(B-Tree)B树是一种自平衡的多路搜索树,主要用于数据库和文件系统的索引结构。节点结构:B树的每个节点可以包含多个关键字(键值)和子节点指针。节点中的关键字按升序排列,且每个关键字对应一个子树的范围。平衡性。原创 2024-09-25 22:04:00 · 1818 阅读 · 0 评论 -
C++ 知识要点:I/O 模型
在 Reactor 模式中,主线程(也称为事件循环或分发器)负责监听和分发事件,工作线程负责处理具体的业务逻辑。以下是使用 实现 Reactor 模式的工作流程,详细描述了事件的处理过程:关注点:程序在等待调用结果(消息,返回值)时的状态。阻塞调用:非阻塞调用:关注点:消息通讯机制。同步:异步:总结:原创 2024-09-21 13:22:00 · 802 阅读 · 0 评论 -
C++ 基础知识小结
它模拟 CPU 缓存的行为,分析程序在缓存层次结构中的表现,帮助开发者优化缓存使用,减少缓存未命中率,从而提高程序运行效率。它能够跟踪程序运行过程中的内存分配和释放,生成堆栈使用情况的图表,帮助开发者识别内存使用的峰值和可能的内存泄漏。通过这种方式,Memcheck 能够有效地识别和报告程序中的内存问题,如野指针访问、内存泄露、未初始化内存使用等,从而帮助开发者提高程序的稳定性和可靠性。派生列表中的访问控制说明符控制派生类的使用者(包括派生类的派生类和派生类的用户)对派生类继承自基类成员的访问权限。原创 2024-09-21 13:21:27 · 718 阅读 · 0 评论 -
C++ 知识要点:变量
作用域static变量具有文件作用域,即它只在定义它的文件内部可见,其他文件即使通过extern也不能访问。生存周期:与全局变量相同,static变量的生存周期也是贯穿整个程序执行期间,从程序开始执行到程序结束。但是,由于它的作用域限制,它只能在定义它的文件内部被访问和修改。原创 2024-09-21 13:21:17 · 883 阅读 · 0 评论 -
C++ 知识要点:函数
函数重载是指在同一作用域内,函数名相同但参数列表(参数的类型、数量或顺序)不同的多个函数定义。编译器通过参数列表来区分这些函数。 修饰形参本身并不直接影响重载的判定,因为修饰的是形参的顶层,不影响参数的类型。但是,如果修饰的是指针或引用所指向的对象,那么它会影响参数的类型,从而可能导致重载。2. 重载与作用域函数重载是在同一作用域内定义的。如果两个函数名相同但参数列表不同,它们必须在同一个作用域内才能构成重载。不同作用域的同名函数(如全局函数和同名成员函数)不构成重载关系,而是隐藏(name hidin原创 2024-09-21 13:21:08 · 324 阅读 · 0 评论 -
C++ 知识要点:类
自赋值:在自定义拷贝赋值运算符时,必须检查源对象和目标对象是否为同一个对象。这通常通过比较它们的地址来完成。如果是同一个对象,则不应执行任何操作,以避免不必要的资源释放和重新分配。参数:参数通常被设计为常量引用,以避免不必要的拷贝,并允许传递const对象。返回类型:拷贝赋值运算符通常返回对当前对象的引用(*this),以支持链式调用。虚函数的实现依赖于虚函数表和虚函数指针,这使得C++能够支持多态性。然而,这种机制也增加了对象的大小,因为每个包含虚函数的类的对象都需要存储一个指向虚函数表的指针。原创 2024-09-21 13:20:50 · 1111 阅读 · 0 评论 -
C++ 知识要点:STL
的clear和erase只会析构元素,不会释放内存(除非显式调用std::deque的clear和erase同样会析构元素,并且可能会根据内部实现和删除操作的具体情况释放一些或全部缓冲区。然而,C++标准并不保证std::deque在调用clear后必须释放所有内存。在面试中,解释这些概念时,可以强调标准库实现的具体行为可能因编译器和库的不同而有所差异,但总体上遵循上述原则。同时,也可以讨论在特定情况下,如内存使用非常紧张时,如何通过手动管理内存(如使用管理动态分配的)或使用其他容器(如。原创 2024-09-21 13:20:39 · 980 阅读 · 0 评论 -
C++ 知识要点:内存管理
C++程序在执行时,其内存使用大致可以划分为几个不同的区域,尽管不同的资料可能会给出略有不同的划分方式,但核心思想是一致的。代码区(Code Segment/Text Segment)用途:存放函数体的二进制代码,包括程序的代码、静态数据和常量等信息。管理方式:由操作系统进行管理,内容在程序启动时加载,通常为只读(Read-Only),以保证代码的安全性和一致性。特点:大小固定,不会随着程序运行的过程而发生变化。全局区(Global/Static Segment)用途。原创 2024-09-21 13:20:22 · 1129 阅读 · 0 评论 -
C++ 知识要点:对象内存模型
在C++中,通过和->访问对象成员的主要区别在于它们的访问方式和语法。用于直接对象,而->用于通过指针间接访问对象。尽管在底层实现和性能上可能存在微小的差异,但这些差异通常被现代编译器的优化所掩盖。更重要的是要考虑代码的可读性、维护性和安全性。在实际的C++实现中,不同的编译器可能会采用不同的策略来记录虚基类子对象的偏移信息。一些编译器可能会选择将偏移信息嵌入到虚函数表中,而另一些则可能会使用额外的指针。这些选择通常取决于编译器的设计目标、性能考虑以及与其他特性的兼容性。原创 2024-09-21 13:20:13 · 884 阅读 · 0 评论 -
C++-Primer-Plus:智能指针
智能指针在C++中是一种强大的内存管理工具,它通过自动管理内存来提高内存安全性和代码易用性。然而,与手动管理内存相比,智能指针也存在一些性能开销和灵活性受限的问题。因此,在选择使用智能指针还是手动管理内存时,需要根据具体的应用场景和需求进行权衡。在大多数情况下,推荐使用智能指针来管理动态分配的内存,以减少内存泄漏和悬垂指针的风险。C++智能指针是一种用于自动管理动态分配内存(堆内存)的数据结构。它们通过封装原始指针,并在内部使用引用计数或其他机制来自动释放所指向的对象,从而避免了内存泄漏和悬挂指针等问题。原创 2024-09-21 13:20:00 · 929 阅读 · 0 评论 -
C++ Primer:模板与泛型编程
实例化定义(Instantiation Definition)是模板编译的另一个关键阶段,它指的是编译器实际生成模板具体类型实例的代码的过程。这个过程可能是隐式的,也可能是显式的。隐式实例化定义发生在编译器自动根据模板定义和类型参数生成具体类型实例时;而显式实例化定义则是用户通过特定的语法告诉编译器生成某个具体类型的实例。隐式实例化定义例子继续上面的compare函数模板例子,当调用时,编译器会自动实例化一个double类型的compare函数版本,这就是隐式实例化定义。显式实例化定义例子用户可以通过。原创 2024-09-21 13:19:29 · 820 阅读 · 0 评论 -
C++ Primer: 内存管理
shared_ptr允许你指定一个自定义的删除器,该删除器在对象被销毁时调用。delete p;// 当p被销毁时,customDeleter被调用unique_ptr同样支持自定义删除器。delete p;// 当p被销毁时,customDeleter被调用。原创 2024-09-21 13:19:19 · 714 阅读 · 0 评论 -
C++-Primer-Plus:18 个重点笔记
虽然从理论上讲,前缀递增/递减操作符由于不需要保存操作前的值而可能更高效,但这种差异在现代C++编程实践中往往被编译器的优化所掩盖。因此,在选择使用前缀还是后缀操作符时,更应该关注的是代码的清晰性和可读性,而不是微小的效率差异。在大多数情况下,遵循团队的编码规范或个人的编码习惯即可。最后,对于C++ Primer这样的经典书籍来说,它可能更多地是从语言规范和实现原理的角度来讨论这个问题,而不是从实际应用中的性能差异出发。原创 2024-09-21 13:19:11 · 1439 阅读 · 0 评论 -
C++ 知识要点:其它
八. 其它调试程序的方法?gdb遇到 coredump 要怎么调试?模板的用法与适用场景用过 C++11?新特性?auto,decltype、explicit、lambda、final函数调用的压栈过程sizeof 和 strlen 的区别?运算符与函数计算的对象编译时运行时union?覆盖、重载与隐藏覆盖要求参数完全相同,用于继承体系的虚函数中重载要求参数不同C++是不是类型安全的?不是,两个不同类型指针可以强制转换gcc 和 g++的原创 2024-09-21 13:19:05 · 281 阅读 · 0 评论 -
C++ 知识要点:关键字
实际上,extern关键字是用于声明的,而不是用于定义的。当你使用extern声明一个变量时,你实际上是在告诉编译器这个变量的定义在别处。但是,你仍然可以在某个地方定义这个变量(通常是.cpp文件中),而不使用extern。然而,在声明时(通常在头文件中),你会使用extern。static关键字在 C++ 中是一个功能强大的工具,它可以用来控制变量的存储期和链接性,以及在类中实现跨对象共享的数据和功能。然而,由于其特殊的性质,使用时需要谨慎考虑,以确保代码的正确性和可维护性。原创 2024-09-21 13:18:58 · 971 阅读 · 0 评论 -
C++四种强制类型转换
从该图可以看出,当父类指针指向的是父类对象的时候,进行dynamic_cast转化的时候,就会转化出错,返回0,所以第一次输出pb2的时候,其指针变量的值就是全0。进行强制类型转化之后,没有创建新的数据,没有开辟空间来存放指针,编译器只是将一种类型的指针当做了另外一种类型对的指针,确保了代码的合法性而已。缺点:由于编译器的优化,就会导致访问const类型的变量的时候,不能实时的访问,有可能内存的值已经发生改变,但是访问到的还是旧的数据。对于函数类型之间的转化也是开辟了一个新的函数,地址发生了改变。原创 2024-09-15 22:04:30 · 1148 阅读 · 0 评论 -
C++设计模式
Abstract Factory 抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。Adapter适配器模式:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工 作。Bridge桥接模式:将抽象部分与它的实现部分分离,使它们都可以独立地变 化。Builder建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建 过程可以创建不同的表示。原创 2024-09-15 22:03:14 · 2063 阅读 · 0 评论 -
C++异常
异常处理是C++ 的一项语言机制,用于在程序中处理异常事件。异常事件在C++中表示为异常对象。异常事件发生时,程序使用throw关键字抛出异常表达式,抛出点称为异常出现点,由操作系统为程序设置当前异常对象,然后执行程序的当前异常处理代码块,在包含了异常出现点的最内层的try块,依次匹配catch语句中的异常对象(只进行类型匹配,catch参数有时在catch语句中并不会使用到若匹配成功,则执行catch块内的异常处理语句,然后接着执行try…catch…块之后的代码。原创 2024-09-15 21:59:58 · 1292 阅读 · 0 评论 -
全面整理:C++11新特性
/ 100ms// 100s// c++14里可以这么使用,这里只是举个自定义字面量使用的例子关于自定义字面量,可以看下chrono的源代码。理论上计算机对于任何变量的访问都可以从任意位置开始,然而实际上系统会对这些变量的存放地址有限制,通常将变量首地址设为某个数N的倍数,这就是内存对齐。转载 2024-09-15 21:46:57 · 1356 阅读 · 0 评论 -
C++ 11新特性(1)
和std::bind在平时编程过程中封装函数更加的方便,而lambda表达式将这种方便发挥到了极致,可以在需要的时间就地定义匿名函数,不再需要定义类或者函数等,在自定义STL规则时候也非常方便,让代码更简洁,更灵活,提高开发效率。• std::thread使线程的创建变得非常简单,还可以获取线程id等信息。• std::mutex通过多种方式保证了线程安全,互斥量可以独占,也可以重入,还可以设置互斥量的超时时间,避免一直阻塞等锁。原创 2024-09-15 21:46:17 · 1552 阅读 · 0 评论 -
C++多态
这一篇文章主要是想记录一下多态以及虚表的一些理解。在派生类中重新定义基类的方法使用虚函数。原创 2024-09-15 21:43:41 · 1082 阅读 · 0 评论 -
C++继承
看看有没有虚继承(virtual public B1);有的话,先调用虚继承的构造函数,在调用普通父类的构造函数,最后调用自己的,一切按顺序来;原创 2024-09-15 21:25:37 · 1092 阅读 · 0 评论 -
C++ IO框架
问题描述:在客户端阻塞于标准输入上的fgets调用时,如果服务器进程突然终止,服务器TCP虽然正确地给客户端发送了一个FIN,但是客户端正阻塞于从标准输入读入的过程,因此无法立即看到这个EOF(文件结束符)。直到从标准输入读到数据后,客户端才能看到EOF,但此时可能已经错过了及时处理服务器关闭的时机。解决方案需求:这样的进程就需要一种预先告知内核的能力,使得内核一旦发现进程指定的一个或多个I/O条件就绪(如TCP连接关闭、标准输入有数据可读等),就通知进程。原创 2024-09-15 21:21:22 · 1401 阅读 · 0 评论
分享