![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c++
文章平均质量分 68
Unique-You
这个作者很懒,什么都没留下…
展开
-
new与malloc的区别
new分配内存按照数据类型进行分配,malloc分配内存按照大小分配; new不仅分配一段内存,而且会调用构造函数,但是malloc则不会。new的实现原理?但是还需要注意的是,之前看到过一个题说int p = new int与int p = new int()的区别,因为int属于C++内置对象,不会默认初始化,必须显示调用默认构造函数,但是对于自定义对象都会默认调用构造函数初始化。翻阅资料后,...原创 2018-05-11 08:36:09 · 338 阅读 · 0 评论 -
More Effective C++(条款17:考虑使用lazy evaluation(缓式评估))
lazy evaluation实际上是"拖延战术":延缓运算直到运算结果被需要为止。如果运算结果一直不被需要,运算也就不被执行,从而提高了效率.所谓的运算结果不被执行,有时指只有部分运算结果被需要,那么采用拖延战术,便可避免另一部分不被需要的运算,从而提高效率,以下是lazy evaluation的四种用途.1. Referenounting(引用计数) 如果要自己实现一个string类,那...原创 2018-03-14 09:30:27 · 284 阅读 · 0 评论 -
MoreEffective C++(条款16:谨记80-20法则)
1. 80-20法则:一个程序80%的资源用于20%的代码上(80%的执行时间华仔大约20%的代码身上,80%的内存被大约20%的代码使用,80%的磁盘访问动作由20%的代码执行,80%的维护力气花在20%的代码上面).80-20法则的重点不在于字面上的数字,而是强调"软件的整体性能几乎总是由其构成要素(代码)的一小部分决定".2. 80-20法则说明软件性能的瓶颈往往只在一小部分代码,而由于"软...原创 2018-03-13 21:21:35 · 164 阅读 · 0 评论 -
More Effective C++(条款15:了解异常处理(exception handling)的成本)
1. 为了支持运行期处理exception,编译器需要做大量的簿记工作:确认如果发生异常所需要析构的对象,必须在每一个try语句块的进入点和离开点做记号,记录每个try语句块对应的catch子句及其能够处理的exception类型等。编译器还需要在运行期做一些对比工作:在exception抛出时适当析构对象并找出正确的catch子句等.可见exception的使用需要大量成本. "即使从未使...转载 2018-03-13 20:58:13 · 203 阅读 · 0 评论 -
静态成员函数和普通成员函数的区别
成员函数:和静态数据成员一样,静态成员函数是所有对象共享的,不是单独属于某一个对象,由于静态成员函数没有传递this指针,故static member function 只能访问static成员,不能访问非static 成员。但是非static却可以访问static 成员。对象在访问静态成员时,可以通过点运算符和箭头运算符。这样就把静态成员函数与某一个对象相连接了,也可以直接用 classNam...转载 2018-03-13 20:50:10 · 976 阅读 · 0 评论 -
More Effective C++(条款14:明智运用exception specifications)
1. Exception specifications作为函数声明的一部分,用于指出(并不能限制)函数可能会抛出的异常函数.C++规定,一个拥有exception specification的函数指针只能被赋予一个有着相同或更为局限的exception specification的函数地址,因而编译器要保证"在函数指针传递之际检验exception specifications".(但visual...原创 2018-03-13 20:09:48 · 250 阅读 · 0 评论 -
More Effective C++(条款13:以by value方式捕捉exceptions)
1. 由条款12知,如果catch子句捕获异常采用by value方式,那么被抛出的异常要被复制两次,这降低了效率。而且将派生类对象传给基类对象有可能会产生切割问题(因为derived class exception object被捕捉,并被视为bass class exception者,将失去其派生成分。被切割的对象其实就是bass class object:缺少derived class d...原创 2018-03-13 13:42:32 · 198 阅读 · 0 评论 -
More Effective C++(条款12:了解“抛出一个异常exception”与“传递一个参数”或“调用一个虚函数”之间的差异)
函数return值与try块throw exception、函数接收参数与catch字句捕获异常相当类似(不仅声明形式相像,函数参数与exception传递方式都有三种:by value,by reference ,by pointer(本质上也是by value) )。 尽管函数调用与异常抛出相当类似,“从抛出端传递一个exception到catch子句”和“从函数调用端传递一个实...原创 2018-03-13 10:53:00 · 240 阅读 · 0 评论 -
More Effective C++(条款11:禁止异常exceptions流出destructors之外)
1、两种情况下destructor会被调用:(1)当对象在正常情况下被销毁,也就是当它离开了它的生存空间或是被明确的删除;(2)当对象被exception处理机制——也就是exception传播过程中的stack-unwinding(栈展开)机制——销毁。2、当destructor被调用时,可能(也可能不)有一个exception正在作用之中,但无法在destructor中区分这些状态(现在有了...原创 2018-03-13 08:45:48 · 340 阅读 · 0 评论 -
static全局变量与普通的全局变量
一、程序的内存分配一个由C/C++编译的程序占用的内存分为以下几个部分:1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。3、全局区(静态区)(static)— 全局变量和静态变量的存...转载 2018-03-12 21:58:59 · 23494 阅读 · 5 评论 -
变量的定义与声明 extern
变量的声明是告诉编译器,该变量名称已经存在,编译器认识这个名字,不会引起编译错误。 对变量进行定义之后,编译器就会给变量分配空间,链接时,链接器可以找到它们的地址。头文件首先说下头文件,其实头文件对计算机而言没什么作用,它只是在预编译时在#include的地方展开一下,没别的意义了,其实头文件主要是给别人看的。我做过一个实验,将头文件的后缀改成xxx.txt,然后在引用该头文件的地方用#incl...转载 2018-03-12 21:47:15 · 979 阅读 · 0 评论 -
new和malloc的区别
自由存储区和堆的区别是一个老生常谈的问题了,就像面试题new和malloc的区别一样。事实上,网上多说人认为,自由存储区与堆的划分标准是申请和释放内存是使用的new/delete还是malloc/free。C++标准并没有给出new/delete应该如何实现,但很多编译器的new/delete都是以malloc/free为基础来实现的。从技术上来说,堆(heap)是C语言和操作系统的术语,堆是操作...转载 2018-03-12 21:03:58 · 283 阅读 · 0 评论 -
More Effective C++(条款18:分期摊还预期的计算成本)
1. Over-eager evaluation("超急评估"):超前进度地做"要求以外"的更多工作,也就是在要求之前就把事情做下去.例如,以下class template用于表现数值数据的大型收集中心:template<class NumericalType>class DataCollection{public: NumericalType min()const; ...转载 2018-03-14 13:17:12 · 218 阅读 · 0 评论 -
编译 解释
A: 计算机不能直接理解任何除及其语言以外的语言,所以必须要把程序员所写的程序语言翻译成机器语言,计算机才能执行程序。将其他语言翻译成机器语言的工具,被称为编译器。 编译器翻译的方式有两种:一个是编译,一个是解释,相对应的是编译型语言和解释型语言。B:编译语言程序执行分为编译、执行两个阶段C:编译语言如JAVA是跨平台语言,编译一次可以在别的系统中不需再次编译直接执行D选项:编译语言首先将源码编译...转载 2018-03-26 14:00:41 · 415 阅读 · 0 评论 -
volatile关键字
(1)访问寄存器要比访问内存要块,因此CPU会优先访问该数据在寄存器中的存储结果,但是内存中的数据可能已经发生了改变,而寄存器中还保留着原来的结果。为了避免这种情况的发生将该变量声明为volatile,告诉CPU每次都从内存去读取数据。(2)一个参数可以即是const又是volatile的吗?可以,一个例子是只读状态寄存器,是volatile是因为它可能被意想不到的被改变,是const告诉程序不应...原创 2018-05-11 08:35:37 · 150 阅读 · 0 评论 -
static关键字作用
1、隐藏变量当两个文件中存在全局变量时,通过extern关键字可以引用不同文件中的变量。如果加入static关键字,全局变量的作用域在文件内,其他文件无法访问。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏.2、静态全局变量静态全局变量具有全局作用域,如果程序包含多个文件的话,它作用于定义它...原创 2018-05-11 08:35:07 · 406 阅读 · 0 评论 -
extern关键字作用
1、extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用”。extern声明不是定义,即不分配存储空间。也就是说,在一个文件中定义了变量和函数, 在其他文件中要使用它们, 可以有两种方式:使用头文件,然后声明它们,然后其他文件去包含头文件;在其他文件中直接extern。2、extern C作用链接指示符extern C 如果程序员希望调用其他程序设计语言尤...原创 2018-05-11 08:34:37 · 20820 阅读 · 0 评论 -
宏定义与自定义类型
#define INT_PTR int* 这是宏定义,编译预处理阶段要进行宏替换,INT_PTR a,b会变成 int* a,b 所以b不是指针类型typedef int* int_ptr; 这是自定义类型,也就是把int_ptr定义为 int型指针,编译阶段会把c,d都识别为指针test.c文件中包括如下语句:1234#define INT_PTR int*typedef int* int_pt...原创 2018-04-04 21:32:58 · 1264 阅读 · 0 评论 -
STL容器 迭代器失效总结
迭代器(iterator)是一个可以对其执行类似指针的操作(如:解除引用(operator*())和递增(operator++()))的对象,我们可以将它理解成为一个指针。但它又不是我们所谓普通的指针,我们可以称之为广义指针,你可以通过sizeof(vector::iterator)来查看,所占内存并不是4个字节。 1.首先对于vector而言,添加和删除操作可能使容器的部分或者全部迭代器...转载 2018-03-17 13:58:09 · 840 阅读 · 0 评论 -
const_iterator与iterator
const vector<int>::iterator it1 = v.begin();vector<int>::iterator const it2 = v.begin();const it2------>vector<int>::iterator it2本身是const,即it2本身的值不能改变,即不能指向其他对象,但it2指向的...原创 2018-04-04 09:39:09 · 576 阅读 · 0 评论 -
编译链接过程
原文出自【比特网】,转载请保留原文链接:http://soft.chinabyte.com/database/174/12454174.shtml C语言的编译链接过程要把我们编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接。编译就是把文本形式源代码翻译为机器语言形式的目标文件的过程。链接是把目标文件、操作系统的启动代码和用到的库文件进行组织形成最终生成可执...转载 2018-04-09 22:30:29 · 243 阅读 · 0 评论 -
char *str1 和 char str2[]的详解
点击打开链接char *str1 = "hello world" 和 char str2[] = "hello world"; 的区别:1、内存管理: 内存分为:只读代码段,只读数据段,BSS,堆,栈五个不同区域。如上图所示:只读代码段一般存放的是编写好的程序。只读数据段(常量存储区)放的是常量(字符串常量,数组名称,函数名称),只读区域不能更改!SS区域(全局/静态存储区)存放的...转载 2018-04-09 22:18:23 · 9124 阅读 · 1 评论 -
类:对象的定义,无参数时,不加括号
class Test{ public: Test(int){} Test(){} void fun(){}};int main(){ Test a(); a.fun();//错,a不是test的对象 Test b(1); b.fun(); return 0;}类是结构体的扩展,在类中封装了对数据成员的操作,缺省的成...原创 2018-04-09 21:55:15 · 1250 阅读 · 0 评论 -
segment fault问题原因分析
点击打开链接segmengt fault类的错误本质原因就是程序访问了非法的地址:1.引用空指针2.野指针3.访问越界造成的原因有多种:主观原因:1.新申请指针忘记赋NULL,也忘记分配空间,直接使用造成非法访问。2.为指针赋值时,地址经过计算而来。计算过程有问题,导致赋值的地址不正确,比如地址经过计算涉及到类型转换之类操作,很容易因为类型转换造成截断。客观原因:3.保存指针的空间被修改,比如你结...转载 2018-04-09 21:27:39 · 3763 阅读 · 0 评论 -
C++后台开发面试常见问题汇总
一、extern关键字作用1、extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用”。extern声明不是定义,即不分配存储空间。也就是说,在一个文件中定义了变量和函数, 在其他文件中要使用它们, 可以有两种方式:使用头文件,然后声明它们,然后其他文件去包含头文件;在其他文件中直接extern。2、extern C作用链接指示符extern C 如果程序员...原创 2018-04-02 21:47:47 · 7385 阅读 · 1 评论 -
More Effective C++(条款10:在constructors内阻止资源泄露)
1. “C++ 只会析构已完成的对象”,“面对未完成的对象,C++ 拒绝调用其析构函数”,因为对于一个尚未构造完成的对象,构造函数不知道对象已经被构造到何种程度,也就无法析构。当然,并非不能采取某种机制使对象的数据成员附带某种指示,“指示constructor进行到何种程度,那么destructor就可以检查这些数据并(或许能够)理解应该如何应对。但这种机制无疑会降低constructor的效率,...转载 2018-03-12 20:41:47 · 307 阅读 · 0 评论 -
异或的运用
异或是一种基于二进制的位运算,用符号XOR或者 ^ 表示,其运算法则是对运算符两侧数的每一个二进制位,同值取0,异值取1。它与布尔运算的区别在于,当运算符两侧均为1时,布尔运算的结果为1,异或运算的结果为0。 异或的性质: 1、交换律:a^b = b^a; 2、结合律:(a^b)^c = a^(b^c); 3、对于任意的a:a^a=0,a^0=a,a^(-1)=~a。 ...原创 2018-03-22 13:31:36 · 2517 阅读 · 0 评论 -
位域 大小端
#include <iostream>using namespace std;struct Test{ unsigned short int a:5; unsigned short int b:5; unsigned short int c:6;};int main(){Test test;test.a=7;//00111test.b=20...原创 2018-03-10 17:01:21 · 207 阅读 · 0 评论 -
RTTI运行时类型识别
type_info为每一个类型增加一个type_info对象。 为了能够在运行时获得对象的类型信息type_info,C++增加了两个运算符:typeid 和 dynamic_cast<>。type_info 常用的三个成员函数是 operator==()、operator!=() 和 name(),请参考标准头文件<typeinfo>. typeid 运算符它以一个对象或...转载 2018-03-15 17:14:44 · 196 阅读 · 0 评论 -
构造函数不能是虚函数 基类析构函数必须为虚函数
1,从存储空间角度 虚函数对应一个虚表vtbl,可是这个vtbl其实是存储在对象的内存空间的。问题出来了,如果构造函数是虚的,就需要通过 vtbl来调用,可是对象还没有实例化,也就是内存空间还没有,无法找到vtbl。所以构造函数不能是虚函数。 vtbl是在编译期就建立了,各个虚函数这时被组织成了一个虚函数的入口地址的数组.而对象的隐藏成员--vptr是在运行期--也就是构造函数被调用时进行初...转载 2018-03-15 19:33:12 · 1576 阅读 · 1 评论 -
More Effective C++ 条款24 了解virtual function,multiple inheritance,virtual base classes,runtime type id
1. 要实现C++的每一个语言特性,不同的编译器可能采取不同的方法,其中某些特性(如标题所列)的实现可能会对对象的大小和其member functions的执行速度带来冲击.2. 虚函数. 当通过对象指针或引用调用虚函数时,具体调用哪一个虚函数由指针或引用的动态类型决定,大部分编译器使用vtbls(virtual tables,虚函数表)和vptrs(virtual table pointe...转载 2018-03-15 13:12:52 · 612 阅读 · 0 评论 -
More Effective C++(条款23:考虑使用其他程序库)
1. "理想的程序库应该小,快速,威力强大,富有弹性,有扩展性,直观,可广泛运用,有良好支持,使用时没有束缚,而且没有'臭虫'".但实际上这种程序库是不可能实现的:要针对速度和大小做优化,往往要牺牲移植性;要有丰富的机能,结果可能不够直观......一个程序库往往要权衡各方面得失,采取折中的方法来实现.2. 不同的程序库侧重点可能不一样,即使两个程序库机能类似,也可能有不同的性能表现. 考虑...转载 2018-03-15 10:50:26 · 141 阅读 · 0 评论 -
More Effective C++ (条款22:考虑以操作符复合形式(op=)取代其独身形式(op))
1. 一般来说,重载了算数操作符(以下称"独身形式"),那么也就要重载复合赋值操作符(以下称"复合形式").要确保操作符的复合形式例如(operator+=)和独身形式(例如operator+)行为相一致,基于前者实现后者是一个好方法.例如:class Rational{public: Rational operator+=(const Rational&); ...}...转载 2018-03-15 10:41:41 · 241 阅读 · 0 评论 -
More Effective C++ (条款21:利用重载技术避免隐式类型转换)
1. 正如条款19和条款20所言,临时对象的构造和析构会增加程序的运行成本,因此有必要采取措施尽量避免临时对象的产生.条款20介绍了一种用于消除函数返回对象而产生临时对象的方法——RVO,但它并不能解决隐式类型转换所产生的临时对象成本问题.在某些情况下,可以考虑利用重载技术避免隐式类型转换.2. 考虑以下类UPInt类用于处理高精度整数:class UPInt{public: UPInt...转载 2018-03-14 20:04:10 · 245 阅读 · 0 评论 -
More Effective C++ (条款20 协助完成返回值优化(RVO))
1. 函数如果返回对象,就会产生临时对象(见条款19)的构造,析构等过程,考虑以下重载的operator*class Rational{public: int getNumerator(){return numerator;} int getDenomerator(){return denominator;} Rational(int numerator,int deno...转载 2018-03-14 19:12:25 · 308 阅读 · 0 评论 -
More Effective C++(条款19:了解临时对象的来源)
1. 所谓的C++临时对象并不是程序员创建的用于存储临时值的对象,而是指编译器层面上的临时对象:这种临时对象不是由程序员创建,而是由编译器为了实现某些功能(例如函数返回,类型转换等)而创建. 由于临时对象不是由程序员创建,其生存期由编译器掌控,因而也就不允许程序员对其进行更改,将其绑定到non-const 左值引用也就被禁止(见C++ 11: 右值引用,转移语义与完美转发),所有编译器都禁止...转载 2018-03-14 17:47:31 · 176 阅读 · 0 评论 -
C++11【1】
一、nullptr与constexprnullptr传统c++会把NULL和0视为同一种东西,这取决于编译器如何定义NULL,有些将NULL定义为((void*)0),有些直接将其定义为0。C++不允许将void*隐式转换为其他类型,但若NULL被定义为((void*)0),则当编译char *ch=NULL;时,NULL只好被定义成0,而这依然会产生问题,将导致C++中重载特性发生混乱。考虑:v原创 2018-01-18 19:27:12 · 235 阅读 · 0 评论 -
More Effective C++(条款26:限制某个class所能产生的对象个数)
1. 针对某些有特殊功能的类,有时需要限制其对象数量,例如系统中只有一个打印机,因此需要将打印机的对象数目限制为1,或者只有16个file descriptor(文件描述器)可用,因此必须确定不会有更多的descriptor objects被产生出来,在这些情况下.就需要限制对象数目,或者说阻止对象被产生出来.2. 允许零个或一个对象 要限制对象数目,最直接的策略是限制构造函数的调用(以下称...转载 2018-03-16 21:13:53 · 209 阅读 · 0 评论 -
More Effective C++(条款一 仔细区别pointers和references )
1、没有所谓的空引用,但可以有空指针2、引用必须初始化,指针不一定要初始化int &a;//错误,没有初始化int b=1;int &rb=b;//正确,rb指向bint *p;//未初始化指针,正确,却风险高3、没有所谓的空引用==》引用可能比使用指针更高效,因为使用引用前不用测试其有效性void printDouble(const double& rd){ ...原创 2018-03-11 12:56:50 · 237 阅读 · 0 评论 -
More Effective C++(条款9:利用destructors避免泄露资源)
1. 栈展开: 函数抛出异常的时候,将暂停当前函数的执行,开始查找匹配的catch子句。首先检查throw本身是否在try块内部,如果是,检查与该try块相关的catch语句,看是否其中之一与被抛出的对象相匹配。如果找到匹配的catch,就处理异常;如果找不到且该try语句嵌套在其他try块中,则继续检查与外层try匹配的catch子句。若还是找不到匹配的catch,就退出当前函数(释放当前...转载 2018-03-12 18:50:14 · 248 阅读 · 0 评论