首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

sstream类的详解

看了这样巴洛克的设计,有没有人还打算在自己的项目中想通过继承 iostream 来实现自己的 stream,实现功能扩展么?...为什么 iostream 要同时继承两个 non-interface class?这是接口继承还是实现继承?是不是可以用组合(composition)来替代?...(见《Effective C++ 第3版》条款38:通过组合模塑出 has-a 或“某物实现”。《C++ 编程规范》条款 34:尽可能以组合代替继承。)...用组合替换继承之后的体系: 注意到新的设计,只有真正的 is-a 关系采用了 public 继承,其他均以组合来代替,组合关系红线表示。...C 语言对此的解决办法是用一个 int 表示 IO 对象(file 或 PIPE 或 socket),然后配 read()/write()/lseek()/fcntl() 等一系列全局函数,程序员自己搭配组合

1.3K10

Effective C++笔记

C++为一个语言联邦 C++不是一个带有一组守则的一体语言:它是从四个次语言(C, Object-Oriented C++, Template C++ 以及 STL)组成的联邦政府,每个语言都有自己的规约...C++的高效编程守则视状况变化,取决于你使用C++的哪一部分 2....初值列列出的成员变量,其排列次序应该和它们class的声明次序相同 为免除“跨编译单元之初始化次序”问题,请local static对象替换non-local static对象 5....你应该在你的所有接口中努力达成在这些性质 “促进正确使用”的办法包括接口的一致性,以及与内置类型的行为兼容 “阻止误用”的办法包括建立新类型、限制类型上的操作,束缚对象值,以及消除客户的资源管理责任 tr1...但是当派生类需要访问受保护的基类的成员,或需要重新定义继承而来的virtual函数时,这么设计是合理的 和复合不同,private继承可以造成empty base最优化

78720
您找到你想要的搜索结果了吗?
是的
没有找到

《深入理解java虚拟机》学习笔记之编译优化技术

为了解决虚方法的内联问题,Java虚拟机设计团队想了很多办法,首先是引入了一种名为“类型继承关系分析”(Class Hierarchy Analysis,CHA)的技术,这是一种基于整个应用程序的类型分析技术...如果编译速度不能达到要求,那用户将在启动程序或程序的某部分察觉到重大延迟,这点使得即时编译器不敢随便引入大规模的优化技术,编译的时间成本静态优化编译器不是主要的关注点。...从实现层面上看,这就意味着虚拟机必须频繁地进行动态检查,如实例方法访问时检查指针、 数组元素访问时检查上下界范围、 类型转换时检查继承关系等。...但从另外的角度来说,还有许多优化是Java的即时编译器能做C/C++的静态优化编译器不能做或者不好做的。 例如,C/C++,别名分析(Alias Analysis)的难度就要远高于Java。...Java的类型安全保证了类似如下代码,只要ClassA和ClassB没有继承关系,那对象objA和objB就绝不可能是同一个对象,即不会是同一块内存两个不同别名。

42720

Empty Base Optimization

说到C++的Empty Base Optimization(简称ebo)可能大家还是比较陌生,但是C++每天都在用的std::string中就用到了ebo。 那么到底什么是ebo呢?...32位的机器上面是8,因为编译器为了存取的方便,会在m_obj的后面产生3 byte的padding,和机器字对齐。总之答案不会是4。...basic_string只包含了一个成员_M_dataplus, 其类型为_Alloc_hider。...所以_Alloc大多数情况下都是类,string经常会在程序中用到, 还很经常会大量的使用,比如在容器,这个时候就需要考虑内存占用了。所以在这里就是用了ebo的优化。...一个例外 在编译器判断是否做ebo的时候,有这么一个例外,就是虽然继承于一个类, 但是子类的第一个非static成员的类型也是这个类或者是这个类的一个子类。在这种情况下,编译器是不会做ebo的。

18911

QT常见面试题,基础知识偏多

答:从外观设计上:QSS、继承绘制函数重绘、继承QStyle相关类重绘、组合拼装等等 从功能行为上:重写事件函数、添加或者修改信号和槽等等 QSS: QSS平时使用的多吗?能举几个例子吗?...() , 是先调用qApp的过滤器, 再对事件进行分析, 决定是否合并或丢弃) 5) 继承QApplication类,并重载notify()函数....使用QReadWriteLock不是QMutex,可以使得多线程程序更具有并发性。 5....引用和指针有何区别: 1.指针是一个对象,引用仅是一个对象的别名 2.引用使用时无需解引用,指针需要 3.引用只能在定义时初始化一次,指针可变 4.引用不能为,指针可以为 5.有多级指针没有多级引用...虚函数可以被直接使用,也可以被子类(sub class)重载以后多态的形式调用,纯虚函数必须在子类(sub class)实现该函数才可以使用,因为纯虚函数基类(base class)只有声明没有定义

5.1K10

JVM性能优化系列-(6) 晚期编译优化

,它与类型继承关系分析一样,并不是直接优化代码的手段,而是为其他优化手段提供依据的分析技术。...java虚拟机的即时编译器与C/C++的静态优化编译器相比,可能会由于下列原因而导致输出的本地代码有一些劣势: 即时编译器运行时占用的是用户程序的运行时间,因此即时编译器不敢随便引入大规模的优化技术,编译的时间成本静态优化编译器不是主要的关注点...java语言是动态的类型安全语言,这就意味着虚拟机必须频繁地进行安全检查 java语言中虚方法的使用频率远远大于C/C++语言,导致即时编译器进行一些优化时的难度要远大于C/C++的静态优化编译器...java语言时可以动态扩展的语言,运行时加载新的类可能改变程序类型继承关系,导致许多全局的优化措施都只能以激进优化的方式来完成 java虚拟机对象的内存分配都是堆上进行的,C/C++的对象则有多种分配方式...,而且C/C++主要由用户程序代码来回收分配的内存,因此运行效率上比垃圾收集机制要高 上面说的java语言相对C/C++的劣势都是为了换取开发效率上的优势付出的代价,而且还有许多优化是java的即时编译器能做

20010

C++笔试面试题整理

reinterpret_casts的最普通的用途就是函数指针类型之间进行转换。 什么是封装?C++是如何实现的?...C++const有什么作用?至少说明3种 const用于定义常量:const定义的常量编译器可以对其进行数据静态类型安全检查。...volatile的意思是易变的,也就是说,程序运行过程,有一些变量可能会被莫名其妙的改变,优化器为了节约时间,有时候不会重读这个变量的真实值,而是去读在寄存器的备份,这样的话,这个变量的真实值反而被优化器给...精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,不是使用保存在寄存器里的备份。...类外有什么办法可以访问类的非公有成员? 友元,继承,公有成员函数。 C++什么时候给变量分配的内存 函数内的局部变量是函数体执行前分配空间。函数执行完毕后回收空间。

2.5K30

字典的创建必须使用dict()函数(vba dictionary 嵌套)

巧用枚举类型来管理数据字典 文章目录 巧用枚举类型来管理数据字典 背景 数据结构表 使用枚举来管理数据字典 枚举的增强使用(枚举里加方法) 枚举的优化策略 第一步优化 : 枚举继承接口 第二步优化 :...枚举是不能够使用继承的, 但是可以实现接口, 尤其是 1.8 版本之后, 通过接口里面的默认方法, 简直和继承抽象类很相像了有没有. 那么我们可以添加一个接口 IDictItem ....第一步优化 : 枚举继承接口 第二步优化 : 增加 Bean 存枚举值, 使用享元模式存储 Bean 思路 我仔细考虑了一下, 对于一个有参数的枚举来说, 初始化的时候类加载器会首先执行枚举项, 也就是调用枚举的构造方法...代码 示例 接下来实际演示一下这种方式的优势, 例如上面的两张表, 我们就可以写成下面的代码 是不是很简单, 每一张表对应一个枚举管理类, 表的字典项, 对应类的一个枚举类, 很方便的将各个枚举分离出来..., 而且使用的时候, 利用IDE工具的提示, 可以非常方便地进行编写, 而且利用枚举里面的方法可以降低很多代码哦.

2.5K20

Yet Another OOP : 基于原型而非基于类

OOP 前阵子知乎回答了一个问题,题主认为C++的三大特性就是封装继承多态,且不说C++本身支持多种范式,即便是OOP也绝对不仅仅局限于这三个特征。...举个例子,钥匙开锁,这里的钥匙和锁的类型理论上都能影响到开锁流程,但是c++绑定代码时只会看一个类型。...基于原型的系统构造对象有两种方法,通过复制(clone)已有的对象,或者通过扩展对象创建。很多框架例如Vue都会通过扩展对象的方式自己重写一套原型链。...例如,JavaScript,默认的顶级对象是Object,它自身具备一些通用的属性和方法,被原型链上的所有对象继承。对象也可以重写继承来的属性(实际上,就相当于对象内部有个指针指向原型对象)。...函数和对象绑定,不是和类绑定,天生就实现了dynamic dispatch。就像是C++为了实现这个功能,也要将vptr和对象绑定一样。

32930

C++继承

继承提供的是一种类设计层次的代码复用,原有类增加扩展并实现新的功能,这样所产生的类叫做派生类或子类,原有类被称为基类或父类。 2....cout _count << endl;// ok,这里不是解引用因为_count静态区 (*ptr).Print();//并不是只要解引用就会报错,而是只要访问了对象的成员才会报错..._d = 5; //监视窗口被编译器优化处理过,不是那么准了,我们改用内存窗口进行观察。 B b; b._a = 1; b....虽然我们有解决菱形继承的方法,但是千万不要设计出菱形继承,如果组合继承都可以用的话,则优先使用组合不是继承。...优先使用对象组合不是继承(转载自博客园博主残雪余香的文章) //继承组合,两者都是复用。继承是白箱复用,组合是黑箱复用。

63910

腾讯、阿里、滴滴后台面试题汇总总结 — (含答案)

原因有两点: 构造对象的时候,必须知道对象的实际类型虚函数行为是在运行期间确定实际类型的,构造对象的时,对象还没有构造成功,编译器无法知道对象的实际类型是该类本身还是其派生类。...(我只说这么多,后来的同学建议说下红黑树的五个特点) Q13. c++类的sizeof大小 A:c++类的大小为1,如果含有虚函数的话,大小为指针的大小。32位系统指针大小是4。...c++要求即使是类,对象也要有存储空间。含有虚函数的类则是因为对象由虚函数指针。 Q14....然后问有没有更好的解法。想了下,给出了优化方案,仍然是归并,去重,然后hash。然后过。 第三题,c++手写单例模式,《剑指offer》第二题。...,把put方法分析出来,数据结构和复杂度就自然出来了 4、有没有多线程的使用经历,如何进行优化讲了项目中的一个多producer多consumer的一个实现,用到了juc包的countdownlunch

7.7K11

重温 CC++ 笔记

建议设计时,少用继承和虚函数,多使用组合。...指针是内存地址,引用是变量别名,指针可以是引用不能为(引用必须初始化,否则编译失败) 引用是通过指针常量实现的 指针完全映射了计算机硬件,操作效率高,是 C++ 效率高的根源。...C++ 函数的特点: 没有类型,只能通过函数指针间接操作 函数都是全局的,没有生命周期的概念(static、namespace 只是限制了范围,避免名字重复) 函数里不能嵌套函数 C++ 的 lambda...C++ 高效、灵活,但开发周期长、成本高,在混合系统里可以辅助其他语言,编写各种底层模块提供扩展功能,从而扬长避短; Python 很“大众”,但比较复杂、性能不是特别高; Lua 比较“小众”...然后链接时,读取多个目标文件里的 GIMPLE 信息,合并成一个。这样 gcc 就能做一些内联优化,从而减少最终生成物体积。 那有没有可能是 -flto 优化过程中生成的信息导致了这个问题呢?

1.2K30

java 和 C 代码运行效率的比较(整理)「建议收藏」

如果编译速度不能达到要求,那用户将在启动程序或程序的某部分察觉到重大延迟,这点使得JIT编译器不敢随便引入大规模的优化技术,编译的时间成本静态优化编译器不是主要的关注点。  ...实现层面上看,这就意味着虚拟机必须频繁进行动态检查,如对象实例访问时检查指针、数组元素访问时检查上下界范围、类型转换时检查继承关系等等。...(4)Java语言是可以动态扩展的语言,运行时加载新的类可能改变程序类型继承关系,这使得很多全局的优化都难以进行,因为编译器无法看见程序的全貌,许多全局优化措施都只能以激进优化的方式来完成,编译器不得不时刻注意并随着类型变化而在运行是撤消或重新进行一些优化...何况,也不见得就没有Java的JIT编译器能做,C/C++的静态优化编译器不能做的优化:由于C/C++编译器的静态性,运行期性能监控为基础的优化措施它都无法进行,如调用频率预测(Call Frequency...:java在运行过程检测对象的引用是否为,如果引用指向都指针,且执行某个方法时会抛出指针异常 6)运行时类型检测开销:java运行时对类型检测,如果类型不正确会抛出ClassCastException

2.2K30

从零开始学C++继承(一):公有私有保护继承、overloadoverwriteoverride之间的区别

一、继承 C++很重要的一个特征就是代码重用。C语言中重用代码的方式就是拷贝代码、修改代码。C++可以用继承组合的方式来重用。通过组合继承现有的的类来创建新类,不是重新创建它们。...关键字private后面声明,只允许本类的函数访问,类外部的任何函数都不能访问。...对基类的数据成员的重定义 对基类成员函数的重定义分为两种 overwrite(隐藏) override(覆盖) (六)、继承组合 无论是继承组合本质上都是把子对象放在新类型,两者都是使用构造函数的初始化列表去构造这些子对象...组合通常是希望新类内部具有已存在的类的功能时使用,不是希望已存在类作为它的接口。组合通过嵌入一个对象实现新类的功能,新类用户看到的是新定义的接口,不是来自老类的接口。...二、用C++设计一个不能继承的类 Java定义了关键字final,被final修饰的类不能被继承。但在C++没有final这个关键字,要实现这个要求还是需要花费一些精力。

91600

Swift学习总结

18、swift任何类型都可以用可类型来说明一个实例可能是nil,objc-c只允许对象是nil 19、声明实例变量时,类型后跟随问号?,则表示该变量是可类型,可以为nil,也可以赋了值。...实例变量不是相同的类型——如果你有一个String变量,就无法不展开可实例的情况下将String?的值赋予给这个变量。...swift,枚举是值类型类型的方法不能对self进行修改,如果希望值类型方法能修改self,需要标记这个方法为mutating。...这里的多继承协议,有点类似c++的抽象类了 你可以协议的继承列表,通过添加 class 关键字来限制协议只能被类类型遵循,结构体或枚举不能遵循该协议。...2、assert与precondition的区别是,assertrelease版本被编译器优化删除,preconditiondebug版本和release版本效果一致 3、Swift可能抛出异常的函数声明中加上关键字

2.9K20

PHP设计模式之适配器模式

Adapter模式使得原本由于接口不兼容不能一起工作的那些类可以一起工作 GoF类图 继承式 ? 组合式 ?...; } } 适配器有两种形式,上方类图中给出了,我们代码实现的组合形式的 继承形式的GoF书中是以C++为示例的,因为C++可以实现多重继承,但现在流行的大部分语言是以接口为形式的,也可以实现...当向另外一个国家扩展业务时,我们换颜料就行啦,用太久了不行就连喷头也换掉(是不是想起了连供打印机) 完整代码:适配器模式 实例 继续发短信,看我能编到什么时候~~~ 各位大拿在对接信息、支付类的接口时...可以考虑重构代码的时候实现提取一个抽象接口,但在这里只是为了演示适配器不一定只是能去针对接口,只要和原对象保持一致,不去继承什么也是可以的,毕竟我们是弱类型语言,如果是类似于Java的强类型,那么继承或者实现还是很有必要的...(多态性) 组合式的适配器与装饰器类似,都会维护一个外部对象,装饰器更多的会使用原来的类的方法,对其进行增加功能的操作,适配器则很少去增加功能,而是直接替换掉 Laravel的Filesystem

60820

C++开源序列化库:FStruct

使用过java或者go的人知道这些语言进行序列化和反序列化是很容易的,对于C++而言,这是困难的,根本原因是C++不支持反射,虽然C++不支持反射,但是我们依旧可以通过自己的方式来保存对象元信息来实现序列化与反序列化...,记得我大二时用C++写的一个client-server小项目,自己规定了传输的数据格式(当时觉得自己解析Json很麻烦),第一个字段应该是什么,第二个字段应该是什么,正是因为没有方便的函数进行转换,...我试着github寻找一些用于C++的序列化与反序列的库,看看有没有什么办法可以帮助我快速把对象转变成JSON,我找到了一些类似的库,但是获得或多或少存在一些问题。...,当必选字段无值时,进行报错(定义为指针类型即为可选字段) 支持XML数据格式的转换 杂项支持: 支持别名✔️ 支持字段忽略✔️ 支持忽略大小写✔️ 支持字段为,则不进行序列化 支持模糊转换 测试文档...int, double, string, bool) //马上支持 //13.支持其他类型指针(指针类型将拥有可选字段属性,对于指针变量,转换时,将先判断指针地址是否为,若为

83400

C++开源序列化库:FStruct

使用过java或者go的人知道这些语言进行序列化和反序列化是很容易的,对于C++而言,这是困难的,根本原因是C++不支持反射,虽然C++不支持反射,但是我们依旧可以通过自己的方式来保存对象元信息来实现序列化与反序列化...,记得我大二时用C++写的一个client-server小项目,自己规定了传输的数据格式(当时觉得自己解析Json很麻烦),第一个字段应该是什么,第二个字段应该是什么,正是因为没有方便的函数进行转换,...我试着github寻找一些用于C++的序列化与反序列的库,看看有没有什么办法可以帮助我快速把对象转变成JSON,我找到了一些类似的库,但是获得或多或少存在一些问题。...✔️ 支持字段为,则不进行序列化 支持模糊转换 测试文档(即使用示例) //测试所用结构体example/testType.h定义 //textType.h struct student{...int, double, string, bool) //马上支持 //13.支持其他类型指针(指针类型将拥有可选字段属性,对于指针变量,转换时,将先判断指针地址是否为,若为

75220

终极 C++避坑指南

C++在演变过程中一直吸收其他语言的优势,不断提供新的语法、工具来进行优化。但为了兼容性(不仅仅是语法的兼容,还有一些设计理念的兼容),还是会留下很多坑。...例如上面的把对应指针置析构时再进行即可。 因此,我们得出的结论是并不是说非平凡析构的类型就不可以使用移动语义,而是非平凡析构类型进行移动构造或移动赋值时,要考虑引用权释放问题。...但是 C++,考虑的是对象的布局,不是 OOP 的理论,所以出现私有继承、多继承等这样的语法也就不奇怪了。...如果Test中出现了很多类成员,这种问题就会被继续放大。 这就是用成员对象来表示组合关系时,可能会出现的问题,私有继承就是为了解决这个问题的。...多继承 与私有继承类似,C++的多继承同样是“语法上”的继承实际意义上可能并不是 OOP 的“继承”关系。

2K20

前端高频面试题(六)(附答案)

(2)第二种方式是使用借用构造函数的方式,这种方式是通过类型的函数调用超类型的构造函数来实现的,这一种方法解决了不能向超类型传递参数的缺点,但是它存在的一个问题就是无法实现函数方法的复用,并且超类型原型定义的方法子类型也没有办法访问到...(3)第三种方式是组合继承组合继承是将原型链和借用构造函数组合起来使用的一种方式。通过借用构造函数的方式来实现类型的属性的继承,通过将子类型的原型设置为超类型的实例来实现方法的继承。...这种继承的思路主要不是为了实现创造一种新的类型,只是对某个对象实现一种简单继承,ES5 定义的 Object.create() 方法就是原型式继承的实现。缺点与原型链方式相同。...这种继承的优点就是对一个简单对象实现继承,如果这个对象不是自定义类型时。缺点是没有办法实现函数的复用。...(6)第六种方式是寄生式组合继承组合继承的缺点就是使用超类型的实例做为子类型的原型,导致添加了不必要的原型属性。

44030
领券