- 博客(30)
- 收藏
- 关注
转载 STL中计算x的n次幂 power()的实现
原文地址:http://blog.youkuaiyun.com/morewindows/article/details/7174143计算x的n次幂最简单直接的方法就是相乘n次,很容易写出程序://计算x^n 直接乘n次int power1(int x, unsigned int n){ int result = 1; while (n--) resul...
2019-03-27 20:21:45
533
原创 将bytes上调至8的倍数
STL源码剖析中有一段代码实现将bytes上调至8的倍数,借鉴了如何将一个数上调至8的倍数这篇博客enum{__ALIGN=8};size_t ROUND_UP(size_t bytes){ return ((bytes)+__ALIGN-1)&~(__ALIGN-1));}这段代码可以这样理解:首先 __ALIGN=00001000;则__ALIGN-1=...
2019-03-12 10:01:57
578
原创 《深度探索C++对象模型》读书笔记:第6章 执行期语意学
6.1 对象的构造解构destructor会被放在对象被构造出来以后的每一个离开点(当object还存活),如每一个return。所以尽量将object放在使用它的那个区段附近。可以节省不必要的对象产生操作和摧毁操作。全局对象Matrix identity;int main(){ Matrix m1=identity; return 0;}identity...
2019-03-08 10:17:50
221
原创 《深度探索C++对象模型》 读书笔记:第五章 构造、解构、拷贝语意学
class Abstract_base{public: virtual ~Abstract_base() = 0; virtual void interface()const = 0; virtual const char* mumble() const{ return _mumble; }protected: char* _mumble;};上面这个类的设计存在一个问题,虽...
2019-03-07 10:32:19
248
原创 《深度探索C++对象模型》 读书笔记:第四章 Function 语意学
4.1Member的各种调用方式Nonstatic Member Functions(非静态成员函数)C++的设计准则之一就是:nonstatic member function 至少必须和一般的nonmember function有相同的效率名称的特殊处理一般而言,member的名称前面会被加上class的明后才能,形成独一无二的命名,也就是mangling手法。对于member...
2019-03-01 10:42:07
290
原创 《深度探索C++对象模型》读书笔记:第三章 Data语意学
3.1 Data Member的绑定1.对于内联函数函数体内的data member绑定操作是在整个class声明完成之后才发生的,所以对于:extern float x;class Point3d{public: Point3d(float, float, float); float X() const { return x; }private: float x, y,...
2019-02-23 16:32:43
182
原创 《深度探索C++对象模型》 读书笔记 2:构造函数语意学
constructor当编译器需要的时候,一个有用的(nontrivial)构造函数才会被声明出来,否则合成的是一个无用(trivial)的默认构造函数。1.如果设计者设计的一个类的基类存在默认构造函数,该类的成员变量类带有默认的构造函数,但是没有提供构造函数,则编译器会为该类生成一个默认的构造函数,调用基类的默认构造函数(按照声明次序)和成员类默认的构造函数(按照声明次序),该成员函数时...
2019-01-12 11:51:51
168
原创 《深度探索C++对象模型》读书笔记 1.关于对象
C++的对象模式有三种:简单对象模型、表格驱动对象模型、C++对象模型1.简单对象模型在这个模型中,object中有一系列的slot,每个slot指向一个member。2.表格驱动对象模型在这个模型中,object有两个slot分别存放指向data member table和member function table的指针。而这两个表格分别含有slot指向data member和 ...
2018-12-28 11:37:49
159
原创 《Effective C++》读书笔记 条款55:让自己熟悉Boost
https://www.boost.org/ 请记住1.Boost是一个社群,也是一个网站。致力于免费、源码开放、同僚复审的C++程序库开发。Boost在C++标准化过程中扮演深具影响力的角色。2.Boost提供许多TR1组件实现品,以及其他许多程序库。...
2018-12-26 11:33:06
155
原创 《Effective C++》读书笔记 条款54:让自己熟悉包括TR1在内的标准程序库
https://aristeia.com/EC3E/TR1_info.html请记住1.C++标准程序库的主要机能由STL、iostreams、locales组成。并包含C99标准程序库。2.TR1添加了智能指针(例如 tr1::shared_ptr)、一般化函数指针(tr1::function)、hash-based容器、正则表达式(regular expressions)以及另外1...
2018-12-26 11:16:10
178
2
原创 《EffectIve C++》读书笔记 条款 53:不要轻忽编译器的警告
请记住1.严肃对待编译器发出的警告信息。努力在你的编译器的最高(最严苛)警告级别下争取“无任何警告”的荣誉2.不要过度倚赖编译器的报警能力,因为不同的编译器对待事物的态度并不相同,一旦移植到另一个编译器上,你原本倚赖的警告信息有可能消失。...
2018-12-26 10:55:47
154
原创 《Effective C++》读书笔记 条款52:写了placement new也要写placement delete
当写一个new表达式Widget* pw = new Widget;一共有两个函数会被调用:一个是用以分配内存的operator new,一个是Widget的default构造函数。如果第一个函数调用成功,第二个函数却抛出异常,为了防止内存泄漏,步骤一就需要调用相应的delete以恢复旧观。运行期系统会调用相应的operator delete,在知道哪一个delete该被调用的时候。对于...
2018-12-26 10:49:19
222
原创 《Effective C++》读书笔记 条款51:编写new和delete时需要固守常规
实现一致性operator new 必得返回正确的值,内存不足时必得调用new-handling函数,必须有对付零内存需求的准备,还需避免不慎掩盖正常行驶的new。operator new的返回值,如果它有能力供应客户申请的内存,就返回一个指针指向那块内存。如果没有能力,就遵循条款49描述的规则,并抛出bad_alloc异常。void * operator new(std::size_t s...
2018-12-25 17:32:21
218
原创 《Effective C++》 读书笔记 条款50:了解new和delete的合理替换时机
替换编译器提供的operator new或operator delete的理由1.用来检测运用上的错误。2.为了强化效能3.为了搜集使用上的统计数据4.为了增加分配和归还的速度5.为了降低缺省内存管理器带来的空间额外开销6.为了弥补缺省分配器中的非最佳齐位7.为了将相关对象成簇集中8.为了获得非传统的行为请记住有许多理由需要写个自定义的new 和 delet...
2018-12-25 16:43:10
166
原创 《Effective C++》读书笔记 条款49:了解new-handler的行为
当operator new无法满足某一内存分配需求时,它就会抛出异常,但在抛出异常前,它会先调用一个客户指定的错误处理函数,一个所谓的new-handler。为了指定这个"用以处理内存不足"的函数,客户必须调用set_new_handler,那是声明与<new>的一个标准库函数:namespace std{ typedef void (*new_handler)();...
2018-12-24 11:28:46
213
原创 《Effective C++》读书笔记 条款48:认识template元编程
Template metaprogramming(TMP,模板元编程)是编写template-based C++程序并执行于编译期的过程。TMP的优点:1.让某些事更容易2.将工作从运行期转移到编译期,使得错误在编译期就能找出来3.高效,较小的可执行文件、较短的运行期、较少的内存需求缺点:使编译时间变长 书上TMP的例子,在编译期计算阶乘,通过递归模板具现化templ...
2018-12-22 09:51:58
180
原创 《Effective C++》读书笔记 条款47:请使用traits classes表现类型信息
如果想写一个将迭代器移动d单位的函数template<template IterT,typename DistT>void advance(IterT& iter,DistT d);//d>0前移,d<0后移具体过程该怎么写呢?直接写iter+=d是行不通的,因为这种只有random acces迭代器才支持。STL迭代器一共有5类1.input迭代器...
2018-12-20 09:55:55
202
原创 《Effective C++》读书笔记 条款46:需要类型转换时请为模板定义非成员函数
对于例子class Rational{public: Rational(int numerator=0,int denominator=1); int numerator()const; int denominator()const;const Rational operator*(const Rational& rhs) const;}//混合算...
2018-12-19 21:02:31
190
原创 《Effective C++》读书笔记 条款45:运用成员函数模板接受所有兼容类型
所谓智能指针是行为像指针的对象,并提供指针没有的机能。真实的指针支持隐式转换,也就是派生类指针能转换成基类指针class Base{public: Base(){}; ~Base(){};private: int b;};class Derived:public Base{public: Derived(){}; ~Derived(){};private: int...
2018-12-19 11:25:39
203
原创 《Effective C++》读书笔记 条款44:将与参数无关的代码抽离templates
在使用templates时可能会造成代码膨胀,所以要找出相同的部分,但在templates中重复是隐晦的,书上的例子template<typename T,std::size_t n>//template支持n*n矩阵,元素是的类型为Tclass SquqreMatrix{ public: void invert();//求逆矩阵}考虑如下调用...
2018-12-17 21:12:06
213
原创 《Effective C++》读书笔记 条款43:学习处理模板化基类的名称
假设我们需要发送信息到若干个不同的公司,每个公司发送的信息分为加密和不加密的两种类型。可以利用模板技术写发送信息的类按照书上的例子,比如现有A、B两个公司,都支持发送普通消息和加密消息。MsgSender是一个模板类,在编译器根据要给哪个公司发送消息调用相应公司的函数。这个做法是可行的。class CompanyA{public: void SendCleartext(const ...
2018-12-10 21:41:03
150
原创 《Effective C++》读书笔记 条款42:了解typename的双重意义
主要就是要记住typename作为从属嵌套名称的前缀很重要在template的声明式中,如:template<class T> class Widget;//使用classtemplate<typename T> class Widget;//使用“typename”typename 和class 的意义完全相同。但是与class不同的是typename还有...
2018-11-13 14:44:40
177
原创 《Effective C++》读书笔记 条款41:了解隐式接口和编译期多态
在面向对象的编程中,总是以显式接口和运行期多态解决问题,而在Temlplate和泛型编程中,主要是隐式接口和编译期多态。1.显式接口由函数的声明构成(函数名称、参数类型、返回类型),如:int fun(int x);看到函数声明我们就知道函数名称,返回类型,参数类型,这种是显示接口。面向对象的编程在类中声明函数,就是显示接口,每当我们调用了类的函数,我们就可以通过类中的声明了解到这个函数的...
2018-11-07 19:05:28
211
原创 《Effective C++》读书笔记 条款40:明智而审慎地使用多重继承
多重继承的存在有其合理性,但是在使用多重继承的时候也要注意存在的问题1.一个派生类可能从多个基类继承相同的名称(函数、typedef等等),这会导致较多的歧义例子:#include<iostream>using namespace std;class base1{public: void fun1(); void fun2();};class bas...
2018-11-06 17:21:02
218
原创 《Effective C++》读书笔记 条款39:明智而审慎地使用private继承
我们已经知道public继承是is-a的关系,在public继承的情况下一个派生类可以暗自转换成一个基类,也就是在需要基类参数的地方传递派生类也是可以的,毕竟public继承是is-a的关系。但是对于private继承情况就不一样了,先看下面这段代码。class Student :private Person{};void eat(const Person& p){}v...
2018-11-04 14:15:00
204
原创 《Effective C++》读书笔记 条款38:通过复合塑模出has-a或“is-implemented-in-terms-of”
复合是类型之间的一种关系,当某种类型的对象内含它种类型的对象,这种关系便是复合。例如下面这段代码,就用到了复合class Address{ ...... };class PhoneNumber{ ...... };class Person{public: ...private: std::string name;//合成成分物 Address address;//同上 Pho...
2018-11-01 09:51:52
441
原创 《Effective C++》读书笔记 条款37:绝不重新定义继承而来的缺省参数值
我们都知道virtual函数是动态绑定的,那么为什么要求绝不重新定义继承而来的缺省参数值呢?先来看一个例子class Shape{public: enum ShapeColor{Red,Green,Blue}; //纯虚函数,因为所有形状都必须提供一个函数,用来绘出自己,而且每个形状都不一样 virtual void draw(ShapeColor color = Red)const ...
2018-10-31 09:59:20
272
原创 《Effective C++》读书笔记 条款36:绝不重新定义继承而来的non_virtual函数
该条款告诉我们不要重新定义继承而来的non_virtual函数,因为派生如果重新定义了继承而来的non_virtual函数会将基类的该函数遮盖,不符合public继承的is-a原则。先来看一段简单的代码class base{public: void mf();};class Deriverd :public base{};Deriverd D;base *pB = &a...
2018-10-30 20:14:18
207
原创 《Effective C++》读书笔记 条款35:考虑virtual函数以外的其他选择
其实这一条款没有特别理解,以下就是一些浅显的记录。virtual函数大家应该都熟悉,将成员函数写成virtual,是为了让派生类能够继承其接口和缺省的实现,如果派生类有自己的实现方式,就重写virtual函数,如果不需要自己特别的实现方式,就继承base class缺省的实现方式即可。常规思维大家在实现类的设计的时候只要涉及到继承,这种需要每个派生类不同的函数,比如对于鸟这种基类,鸟会叫,但是每...
2018-10-30 10:08:10
234
原创 《Effective C++》读书笔记 条款34:区分接口继承和实现继承
第一次记录读书笔记,因为觉得纯读很没有意思,于是突然决定开始写博客记录一下,理解的也不深。菜鸟也希望能有进步,希望自己坚持,前面的条款在后来会补。这一条款主要讲纯虚函数、虚函数和普通成员函数在public继承时不同的地方。public继承的概念包括两个:函数的接口继承和函数的实现继承。类中的成员函数有三种类型,纯虚函数,虚函数、普通成员函数,这三种类型在public继承时的不同如下表|纯虚函数...
2018-10-26 14:38:23
183
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人