![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C/C++
文章平均质量分 59
xbwueric3
这个作者很懒,什么都没留下…
展开
-
[effectiv c++]条款20:pass-by-reference-to-const 与 pass-by-value(解决slicing问题)
减少构造函数的开销避免slicing(对象切割)问题:当一个derived class对象以by value方式传递并被视为一个base class对象,实参会调用base class的构造函数,当对象调用一个虚函数时,实际调用的时base class的函数而不是derived class的函数。在C++编译器的底层,references往往以指针实现,pass-by-reference通常意味原创 2017-09-19 12:04:27 · 385 阅读 · 0 评论 -
[effectiv c++]条款21:返回reference 与 返回object
Complex num1(1, 2);Complex num2(3, 5);Complex result = num1 * num2;如果要实现 operator* 函数, 函数内需要创建一个Complex对象并返回方法一:在stack空间创建对象const Complex& operator*(const Complex& lhs, const Complex& rhs){ Comp原创 2017-09-19 12:06:10 · 403 阅读 · 0 评论 -
局部性原理
局部性原理时间局部性(Temporal Locality)如果一个信息项正在被访问,那么在近期它很可能还会被再次访问。应用将某些数据在一段时间内集中处理,提高cache利用率空间局部性(Spatial Locality)在最近的将来将用到的信息很可能与现在正在使用的信息在空间地址上是临近的。应用数组逐行遍历效率比逐列遍历效率高,因为地址步进较小...原创 2018-02-14 16:48:21 · 737 阅读 · 0 评论 -
[effectiv c++]条款25:考虑写出一个不抛出异常的swap函数(pimpl手法)
缺省状态 只要类型T支持copy构造函数和copy assignment。namespace std { template<typename T> // template<> 表示它是 std::swap 的一个全特化版本 void swap(T& a, T& b)// 函数名称后的 <Widget> 表示这一特化版本...原创 2017-09-19 19:16:50 · 295 阅读 · 0 评论 -
可重入与线程安全
可重入与线程安全概念线程安全函数:函数可以同时被多个线程调用,并安全访问共享数据(各个线程有序访问)。可重入函数:函数可以同时被多个线程调用,但每个线程只能使用各自的数据。线程安全的类:每个线程使用这个类的相同的实例,成员函数也可以被每线程安全调用。可重入的类:每个线程使用这个类的不同的实例,成员函数就可以被每线程安全调用。可重入性 class Counte...原创 2018-03-15 15:56:18 · 134 阅读 · 0 评论 -
[STL源码剖析]空间置配器allocator
空间置配器allocatorplacement new 与 newnew关键字操作:调用operator new为对象申请内存在申请到的内存地址上调用对象的构造函数返回对象的地址placement new的作用不是开辟新内存,是在指定内存块上构造对象。举例class A {...};class B {...};A* pa = new A;pa-&...原创 2018-03-09 16:33:35 · 210 阅读 · 0 评论 -
[STL源码剖析]序列容器
序列容器Vector概念vector维护的迭代器有三个: start:目前使用空间的头end:目前使用空间的尾end_of_storage:目前可用空间的尾增加新元素时,如果超过当时的容量,则容量则会扩充2倍。扩充不是在原有空间上新增,而是需要重新配置、元素移动、释放原空间等过程。 当然,vector的每种实现都可以自由地选择自己的内存分配策略,分配多少内存取决于其...原创 2018-03-11 16:11:59 · 165 阅读 · 0 评论 -
成员函数内delete this
delete this以下引用自:http://www.cppblog.com/lovedday/archive/2008/06/03/52060.html 成员函数调用delete this合法吗? 只要你小心,一个对象请求自杀(delete this),是可以的。 以下是我对“小心”的定义: 你必须100%的确定,this对象是用 new分配的(不是用new[],...原创 2018-05-04 20:42:18 · 293 阅读 · 0 评论 -
C++ 对象的内存布局理解(棱形继承)
C++ 对象的内存布局理解以下是我看完陈皓的C++对象的内存布局后的一些理解普通继承单一继承(A-&gt;B, B-&gt;C) 虚函数表在最前面被重载的虚函数得到更新,未重载的虚函数按照声明和继承顺序排在后面数据成员在虚函数表后面,按照声明和继承顺序排在后面多重继承((A,B,C)-&gt;D) 每个父类都有自己的虚表,虚表后面是父类的数据成员,子类成员在所有父类内存布局...原创 2018-05-04 20:45:10 · 218 阅读 · 0 评论 -
动态链接与静态链接
静态库Linux下的静态库通常以.a为后缀,用于创建.a的工具为ar(archive的缩写).静态库链接后会将所有数据会添加到调用程序, 因此使用静态库的程序体积可能较大,但是使用静态库的程序不需要外部依赖项.举例以hello.cpp、hello.h为例生成目标文件 g++ -c hell.c -o hello.o生成静态库 ar -crv libhello.a hel...原创 2018-07-16 20:07:50 · 197 阅读 · 0 评论 -
[effectiv c++]条款11:operator=的自我赋值与异常处理
证同测试解决自我赋值的问题。 Test& Test::operator=(const Test& rhs){ if (this == &rhs) return *this; delete pb; pb = new Bitmap(*rhs.pb); return *this;}异常处理(如执行new时可用空间不足)可以用copy-and-swap技术解决,同时可以解原创 2017-09-19 12:02:56 · 349 阅读 · 0 评论 -
[effectiv c++]条款5:了解C++默默编写并调用哪些函数
条款5:了解C++默默编写并调用哪些函数对于一个empty class,如果你自己没声明,编译器就会为它声明(编译器版本的)一个copy构造函数,一个copy assignment操作符,一个析构函数,此外如果你没有声明任何构造函数,编译器会声明一个default构造函数。所有这些函数都是public且inline。 但惟有这些函数被调用,它们才会被编译器创建出来编译器拒绝生成copy assig原创 2017-09-10 10:20:41 · 203 阅读 · 0 评论 -
[effectiv c++]条款39:明智而审慎地使用private继承
class Timer {public: explicit Timer(int tickFrequency); virtual void onTick() const; ……};class Widget : private Timer {private: virtual void onTick() const; ……};private继承代替方法: 继原创 2017-09-23 14:35:26 · 199 阅读 · 0 评论 -
子函数中的内存分配(二级指针的应用)
在子函数 func 中分配一段内存空间错误例子:#include using namespace std;bool func(char *p){ printf("*p = %d, p = %d, &p = %d\n", *p, p, &p); if (NULL == (p = (char*)malloc(sizeof(char)))) {原创 2017-04-19 15:54:11 · 590 阅读 · 0 评论 -
一个类成员函数的局部静态变量问题
原文:http://www.cnblogs.com/Tour/p/4080212.html?utm_source=tuicool&utm_medium=referral 当时遇到的需求需要这样处理:调用某个类对象的某个成员函数时,第一次有具体意义的,其他时候都是保持不变的、无意义的。这个需求转载 2017-03-11 16:26:56 · 434 阅读 · 0 评论 -
字符串赋值给指针与数组的区别
代码int Test() { // Test1 char str1[] = "hello world"; char str2[] = "hello world"; if (str1 == str2) cout << "str1 equal str2" << endl; else cout << "str原创 2017-08-27 16:16:51 · 574 阅读 · 0 评论 -
c++笔记
最近重新温习了一遍c++,把一些原本掌握不牢的语法记了下来。引用int n = 4;int & setValue() {return n;}int main(){ setValue() = 40;//setValue的返回值是引用,是一个左值 cout << n << endl; return 0;} // 输出: 40...原创 2017-07-18 11:25:54 · 591 阅读 · 0 评论 -
[effectiv c++]条款37:绝不重新定义继承而来的缺省参数值(动态绑定,静态绑定,多态性)
动态绑定与静态绑定静态类型,就是它在程序中被声明时所采用的类型,在编译期确定,不可更改。 动态类型,则是“目前所指的对象的类型”,在运行期决定的,可以更改。 静态绑定,绑定的是对象的静态类型,某特性(比如函数)依赖于对象的静态类型,发生在编译期。 动态绑定,绑定的是对象的动态类型,某特性(比如函数)依赖于对象的动态类型,发生在运行期。静态多态性与动态多态性静态多态性:函数多态性——函数重载原创 2017-09-22 20:44:44 · 283 阅读 · 0 评论 -
[effectiv c++]条款33:避免遮掩继承而来的名称(重载,覆盖,隐藏)
class Base{private: int x;public: virtual void mf1() = 0; virtual void mf2(); void mf3(); ……};class Derived: public Base{public: virtual void mf1(); void mf4(); ...原创 2017-09-19 21:17:50 · 308 阅读 · 0 评论 -
[effectiv c++]条款2:尽量以const,enum,inline替换#define(static,const定义式)
1、你所使用的名称可能并未进入记号表如 #define ASPECT_RATIO 1.653 中的记号名称ASPECT_RATIO可能由于预处理器的处理,而未被真实编译器看见,于是记号名称未能进入记号表。解决方法:用编译器替换预处理器 即用const替换宏(#define) const double AspectRatio = 1.653 作为一个语言常量,AspectRatio一定...原创 2017-09-07 10:07:51 · 207 阅读 · 0 评论 -
explicit 隐式转换与显示转换
explicit关键字:用于防止单参数构造函数的隐式转换功能(多参数构造函数不会执行隐式转换)class myDig { int value;public: explicit myDig(int n) { value = n; }}void doSomething(myDig num); //函数,接受一个myDig参数,函数体不重要,故省略...原创 2017-09-07 10:06:11 · 290 阅读 · 0 评论 -
局部变量内存分配时间、静态变量的初始化时间、常量折叠
例1 局部变量void Test1(){ ………… int buf[1024 * 1024]; …………}在windows下,由于栈限制为1M,上面代码可能会栈溢出,因此通过单步调试我们可以知道,局部变量是在进入函数时分配栈内存。编译器在编译的过程中,遇到函数调用时,会加入几条汇编指令。这些汇编指令的作用是: 1 分配一段栈空间,用于存放被调函数的参数...原创 2018-07-23 19:06:34 · 2799 阅读 · 0 评论