关于STL容器实现,非侵入式容器+Iterator框架和“侵入式”容器实现的思考

C++进阶实战:精选八大开源项目,从网络编程到存储引擎 C++作为高性能系统开发的核心语言,其工程化实践离不开对网络编程、并发模型、数据结构存储引擎等核心概念的理解。网络编程涉及I/O多路复用、线程池HTTP协议解析,是构建高性能服务器的基石。并发模型通过生产者-消费者模式管理任务队列,有效提升吞吐量。数据结构如红黑树跳表,是实现高效容器存储系统的关键。这些技术共同支撑了从Web服务器到数据库引擎等广泛的应用场景。本文聚焦于TinyWebServer、MyTinySTLrocksdb等八个精选开源项目,通过剖析其源码,帮助开发者掌握C++在实战中的高级 阅读详情
嗯,看Bjarne的《The C++ Programming Language》的时候记的。刚刚又看到,整理到BLOG上吧。
 
对于Iterator实现的缺点,即虚函数的调用造成的开销,解决方法只有抹去虚函数,然而这样又如何做到多态?
 
对于“侵入式”容器(注:即容器内元素需要继承容器框架提供的特定接口/超类才能放入容器的设计,如Java中只有Object的子类才能进入 Java的容器里……貌似是废话,但对cpp就不是了)。BJ(注:Bjarne,cpp老豆)认为基于Object的容器实现很糟糕。然而对于Java 这种单根继承的OO语言来说,基于Object的容器并不算是“侵入”(语言是“侵入”式的?)。这种容器的缺点就是转型和不能直接放入基本类型的麻烦以 及由此带来的性能开销。在JDK5中,自动装箱和泛型语法已经消除了这些人工上的因素,性能上的缺陷则无法弥补。
关于BJ认为的容器的“胖界面”,其实并不成为问题,如果一切有一个完好的约定的话,意思是说,若某个方法返回一个抽象到Collection的容器,我们会事实上的对这个容器做功能上的最小假设,即关于顺序,操作时间等都不要做过多的要求;而假如返值是 List,则我们就会希望它的有序性,以此类推。这种用接口表达出来的容器实质上也在传递“概念”而非“类”的观念。这和STL的观念是类似的。尽管对于Collection的“肥大界面”,很多方法只能在实现中抛出 UnsupportedMethodException,这一事实显得它不那么优雅,但它提供了更明显的可读性和编译期的类型检查。
反观STL,它的typename关键字已经很能说明问题,若某个方法操作一个泛型容器C:
深入理解侵入式容器非侵入式容器(intrusive containers) 介绍了侵入式非侵入式容器 阅读详情

相关推荐

理解 Golang interface

interface 是GO语言的基础特性之一。可以理解为一种类型的规范或者约定。它跟java,C# 不太一样,不需要显示说明实现了某个接口,它没有继承或子类或“implements”关键字,只是通过约定的形式,隐式的实现interface 中的方法即可。因此,Golang 中的 interface 让编码更灵活、易扩展。...

zkfopen的博客 957

彻底搞懂多态

完全可以,事实上,像c#,rust,go,Swift这些语言都是这么做的,不管继承多少个接口,都不会增大对象的体积,只有在真正动态使用时,才会生成虚函数表指针,并且指向对象的指针绑定在一起,也就是所谓的胖指针(fat pointer)。事实上,这也正是存在类型的本质,理想情况下,所有的接口都应该通过泛型函数去调用。传统的虚函数对这个问题束手无策,使用非侵入式多态的新语言也没什么好办法,对于comparable这种的接口,要么只静态使用,要么求助于dynamic_cast这样的机制,显然,这不是好办法。

KeLiaoo的博客 1182

java非侵入式接口实现,C++编写非侵入式接口

终于写到c++非侵入式接口了,兴奋,开心,失望,解脱,…… 。在搞了这么多的面向对象科普之后,本人也已经开始不耐烦,至此,不想做太多阐述。虽然,很早就清楚怎么在c++下搞非侵入式接口,但是,整个框架代码,重构了十几次之后,才终于满意。支持给基本类型添加接口,好比int,char,const char*,double;支持泛型,好比vector,list;支持继承,基类实现的接口,表示子类也继承了...

weixin_39657662的博客 245

侵入式容器及Boost.Intrusive

非侵入式容器存储的是对象的拷贝,而不是传递给容器的原始对象,例如STL容器,当插入对象时,需要申请内存存放拷贝的对象,而对象在容器内的关系是由容器本身数据结构来维护的,内容内对象本事并不知道容器信息。侵入式容器直接存储传递给容器的原始对象,而不是对象的拷贝。对象内部维护容器之间的关系。

doingli的博客 7589

从零实现基于红黑树的C++ Map与Set:深入理解STL容器底层原理

红黑树作为一种自平衡二叉搜索树,通过颜色标记旋转操作维持近似平衡,确保插入、删除、查找等核心操作的时间复杂度稳定在O(log n)。这一特性使其成为实现高效关联容器的理想底层数据结构,广泛应用于需要快速查找有序存储的场景,如数据库索引、内存缓存编译器符号表。在C++ STL中,mapset正是基于红黑树构建,提供了键值对键的唯一有序存储。本文聚焦于红黑树的实现原理与工程实践,通过模板编程技巧,设计通用红黑树结构,并基于此封装出功能完整的MapSet容器,涵盖迭代器设计、插入删除的平衡调整等关键技

cuiji1279的博客 298

C++函数模板实战:从崩溃max到工业级日志系统

函数模板是C++类型系统与编译期计算能力的核心交汇点,其本质并非语法糖,而是实现类型安全、零开销泛型的关键机制。它通过模板参数推导、SFINAE、constexpr if等特性,在编译期为不同数据类型生成最优机器码,支撑高性能序列化、无虚函数类型擦除及向量化运算等关键场景。本文聚焦函数模板的工程落地,深入剖析模板参数推导冲突、自定义类型比较缺失、日志零开销开关等真实痛点,并以max函数演进、类型安全日志、碰撞检测重构为线索,展现如何用可变参数模板、std::common_type、ADL规避与折叠表达式构建

weixin_30855099的博客 332

深入C++与QT高频面试题(不定时更新)

本文总结了C++、数据库Qt相关的常见面试题,涵盖以下核心内容: C++特性与智能指针 智能指针(unique_ptr/shared_ptr/weak_ptr)解决内存管理问题 构造函数/析构函数特性,虚函数与纯虚函数区别 STL容器分类与特性(vector/list/set/map等) 多线程编程 线程创建方式(Thread类/moveToThread) 线程同步机制(互斥锁/条件变量/读写锁) 进程间通信方式(管道/共享内存/消息队列) 数据库基础 事务ACID特性与操作流程 索引原理与使用场景 关系

阿博的博客 1212

侵入式容器

侵入式容器也是用于容纳元素的容器,但元素必须要做出一些代码上的适度修改才能被容纳。与侵入式容器相对应的是非侵入式容器,标准容器指针容器都属于非侵入式容器,这类容器不要求对容纳的元素做任何修改即可容纳,较温,用起来也简单方便。链表、二叉树等数据结构都属于侵入式容器

zuolj的专栏 4416

侵入式非侵入式

侵入式非侵入式侵入式利弊非侵入式利弊拓展小结 侵入式 一句话概括就是,你的代码需要依赖框架的代码,如果把框架拿掉或者换一个框架,就需要重新修改代码。 举个很简单的栗子啦: 1.如果使用侵入式框架,一般需要继承或者实现框架的某一个类或接口,这样你把框架拿到以后就会运行不起来,甚至在代码层面会报错哦。 2.当你的代码引入了一个组件,导致其它代码或者设计,要做相应的更改以适应新组件.这样的情况我们就...

杨的博客 7044

告别继承!Folly Poly实现侵入式C++运行时多态的终极指南

在C++开发中,传统继承带来的耦合性侵入性一直是开发者头疼的问题。Facebook开源的Folly库提供了一个革命性的解决方案——**Folly Poly**,它通过类型擦除技术实现了真正的无侵入式运行时多态。本文将带你深入了解这项强大技术,彻底摆脱继承枷锁,构建更灵活、更优雅的C++代码架构。 ## 🧩 什么是Folly Poly? **Folly Poly**是Facebook开源C+

gitblog_00967的博客 394

Golang系列(四)之面向接口编程

1. 接口[多态] ​多态性(polymorphisn)是允许你将父对象设置成为一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。 简而言之,就是允许将子类类型的指针赋值给父类类型的指针。 即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。不修改程序代码就可以改变程

胡伟煌的博客 1万+

java 非侵入式_非侵入式设计 侵入式设计 意思?

非侵入式系介绍DI用语,我得理解是两个组件(类,接口)之间,比较独立,不深入到另一个类内部,哪位大虾能点拨一二?关于“侵入式非侵入式”设计有读者讲“侵入式”这一术语无法理解,这里给一个简单解释,是我个人的看法。在设计一个类时,按理说,需要考虑的应该只是该类所企图表示的那个“概念”本身:为表示有关概念应记录哪些信息,该类的对象与外界交换信息的界面等等。但定义这个类并不是为了放在那里观赏,而是为...

weixin_35692916的博客 719

侵入式、状态管理

什么是侵入式非侵入式编程? 侵入式:引入了框架,对现有的类的结构有影响,需要实现框架的某些接口或者某些特定的类。是用户的代码对框架产生了依赖,不利于代码的复用性,将框架去除后,程序无法运行。好处是使用户代码与框架更好的结合,充分利用了框架提供的功能。 非侵入式:引入框架,对现有的类的结构没有影响,不需要实现某些接口特定类。移出框架程序也可正常运行。缺点与用户代码互动的方式可能比较复杂;优点没有过多的依赖,能够很方便的迁移到其他地方。 什么是有状态会话无状态会话? ...

weixin_44279264的博客 1078

Go语言之interface详解

go语言interface详解,interface的使用场景,实现多态示例,

yuqiang870的博客 1万+

C++STL模板笔记(一)

C++STL模板笔记

znr1995的博客 432

做Spring开发,这些知识你会了吗

Spring 开发 1. 什么是Spring? 2. Spring Framework 3. IOC容器 1)IOC容器原理 2)依赖注入方式 3)无侵入容器 4)理解 5)装配 Bean 6)ApplicationContext 7)使用Annotation配置 4. 使用 AOP

weixin_44491927的博客 531

侵入式非侵入式概念

注:此篇博客的内容主要摘录自其他人的博客,并加以整理,下述会给出详细出处。 侵入式非侵入式设计:在学框架时,经常会遇到侵入式设计与非侵入式设计?究竟是什么意思? 参考侵入式非侵入式概念。 这两种设计,主要是基于系统扩展性以及依赖性来说的。 当我们用Struts2框架做系统时,Action需要继承Struts2的一个基类,这样我的代码就被侵入了(基类中的部分内容方法与我的设计内容不相关),如...

JiaYue博客 5749

Boost序列化全解析

程序开发中,序列化是经常需要用到的。像一些相对高级语言,比如JAVA, C#都已经很好的支持了序列化,那么C++呢?当然一个比较好的选择就是用Boost,这个号称C++准标准库的东西。 什么时候需要序列化呢?举个例子,我们定义了一个class,比如: class CCar { public: void SetName(std::string& strName){m_strName = strName;} std::string GetName() const{return m_s...

jinking01的专栏 4400
上一篇: C中动态二维数组的获取
下一篇: 对动态规划和贪心算法的一点理解
hanbf
博客等级 码龄22年 8粉丝 9原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值