c++
Arlingtonroad
这个作者很懒,什么都没留下…
展开
-
通过未初始化全局变量,研究BSS段和COMMON段的不同
最近正在重温《程序员的自我修养》一书,由于水平比以前有所提升,所以读书的收获也不一样。 下面针对该书3.3.3节BSS段的内容进行更细节的探讨——该节内容不在本文中重复说明了,只说一下结论。对于全局变量来说,如果初始化了不为0的值,那么该全局变量则被保存在data段,如果初始化的值为0,那么将其保存在bss段,如果没有初始化,则将其保存在common段,等到链接时再将其放入到BSS段。关于第三点不同编译器行为会不同,有的编译器会把没有初始化的全局变量直接放到BSS段。...转载 2020-07-22 16:37:36 · 760 阅读 · 0 评论 -
c/c++源码编译成可执行文件详解
C源文件到可执行文件共经历了4个过程。在使用GCC编译程序时,编译过程可以被细分为四个阶段,包括预处理、编译、汇编、链接。1、预处理 在预处理阶段,编译器主要作加载头文件、宏替换、条件编译的作用。一般处理带“#”的语句。 我们可以通过gcc 的 -E 选项进行查看,如下所示:gcc -E main.c > main.i 编译器将main.c预处理结果输出 main.i 文件。2、编译 在编译过程中,编译器主要...原创 2020-07-22 16:27:44 · 1474 阅读 · 0 评论 -
c++内存管理机制详解
[导语] 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对C++的痛恨,但内存管理在C++中无处不在,内存泄漏几乎在每个C++程序中都会发生,因此要想成为C++高手,内存管理一关是必须要过的,除非放弃C++,转到Java或者.NET,他们的内存管理基本是自动的,当然你也放弃了自由和对内存的支配权,还放弃了C++超绝的性能。本期专题将从内存管理、内存泄漏、内存回收这三个方面来探讨C++内存管...转载 2020-07-14 17:53:12 · 1562 阅读 · 0 评论 -
C++虚函数表,虚表指针,内存分布
前言 大家都应该知道C++的精髓是虚函数吧? 虚函数带来的好处就是: 可以定义一个基类的指针, 其指向一个继承类, 当通过基类的指针去调用函数时, 可以在运行时决定该调用基类的函数还是继承类的函数. 虚函数是实现多态(动态绑定)/接口函数的基础. 可以说: 没有虚函数, C++将变得一无是处! 既然是C++的精髓, 那么我们有必要了解一下她的实现方式吗? 有必要! 既然C++是从C语言的基础上发展而来的, 那么我们可以尝试用C语言来模拟实现吗? 有可能! 接下来, 就是我...转载 2020-07-14 15:52:41 · 295 阅读 · 0 评论 -
【c++ Primier】第十六章 模板与泛型编程
泛型编程鱼面香对象编程一样,都依赖于某种形式的多态性。面向对象编程所依赖的多态性成为运行时多态性,泛型编程所依赖的多态性成为编译时多态性或参数式多态性。 模板定义以关键字template开始,后接模板形参表,模板形参表是用尖括号括住的一个或多个模板形参的列表,形参之间以逗号分隔。模板形参表不能为空。 函数模板定义如下:template <typename T>int compare(const T &v1, const T &v2){ ...原创 2020-07-11 21:26:35 · 182 阅读 · 0 评论 -
【c++Primier】第十五章 面向对象编程
定义为virtual的函数是基类期待派生类重新定义的,基类希望派生类继承的函数不能定义为虚函数。 继承层次的根类一般都要定义虚析构函数。 除了构造函数外,任意非static成员函数都可以是虚函数。保留字virtual只在类内部的成员函数声明中出现,不能用在类定义体外部出现的函数定义上。 派生类只能通过派生类对象访问其基类的protected成员,派生类对其基类类型对象的protected成员没有特殊访问权限。 引用和指针的静态类型和动态类型可以不同,这是C++用以支持多态性的基石。 无论派生列表中原创 2020-07-11 21:22:29 · 152 阅读 · 0 评论 -
【c++ Primier】第十四章 重载操作符与转换
用于内置类型的操作符,其含义不能改变。也不能为任何内置类型定义额外的新的操作符。 在&&和||的重载版本中,将失去操作符的短路求值特征,两个操作数都要进行求值,而且对操作数的求值顺序不作规定。因此,重载&&,||,取地址操作符或逗号操作符通常不是一种好的做法。 将操作符设置为类成员还是普通非成员函数,原则如下: 赋值(=),下标([]),调用(())和成员访问箭头(->)必须定义为成员,否则编译出错。 IO操作符应为非成员函数,否则左操作数将只能是该类类型的对原创 2020-07-11 21:19:03 · 170 阅读 · 0 评论 -
【c++ Primier】第十三章 复制控制
复制构造函数、赋值操作符和析构函数总称为复制控制。复制构造函数是一种特殊构造函数,具有单个形参,该形参(常用const修饰)是对该类类型的引用。当定义一个新对象并用一个同类型的对象对它进行初始化时,将显式使用复制构造函数。当将该类型的对象传递给函数或从函数返回该类型的对象时,将隐式使用复制构造函数。 析构函数是构造函数的互补 当对象超出作用域或动态分配的对象被删除时,将自动应用析构函数。不管类是否定义了自己的析构函数,编译器都自动执行类中非static数据成员的析构函数。 与构...原创 2020-07-11 21:15:39 · 150 阅读 · 0 评论 -
【c++Primier】第十二章 类
有关类的一些重要知识点:类定义了数据成员和函数成员: 数据成员用于存储与该类类型的对象相关联的状态,而函数成员则负责执行赋予数据意义的操作。 最简单的来说,类就是定义了一个新的类型和一个新的作用域。 public和private关键字 在public部分定义的成员可被使用该类型的所有代码访问; 在private部分定义的成员可被其他类成员访问。 所有成员必须在类的内部声明,一旦类定义完成后,就没有任何方式可以增加成员了。 在类内部,声明成员函数是必需的,而定义成员函数则是可选原创 2020-07-11 21:11:19 · 194 阅读 · 0 评论 -
【c++ Primier】第十一章 泛型算法
使用泛型算法必须包含algorithm头文件: #include<algorithm>; 标准库还定义了一组泛化的算术算法,使用这些算法则必须包含numberic头文件 #include<numeric>1. 只读算法find(vec.begin(),vec.end(),search_value) 使用两个迭代器和一个值调用find函数,检查两个迭代器实参标记范围内的每一个元素,只要找到与给定值相等的元素...原创 2020-07-11 20:54:48 · 151 阅读 · 0 评论 -
【c++Primier】第十章 关联容器
关联容器类型:map set multimap multiset.1. pair类型pair<T1,T2> p1; 创建一个空的pair对象,它的两个元素分别是T1和T2类型,采用值初始化。 pair<T1,T2> p1(v1,v2); 创建一个pair对象,它的两个元素分别是T1和T2类型,其中first成员初始化为v1,而second成员初始化为v2 make_pair(v1,v2) 以v1和v2值创建一个新的pair对象,其元素...原创 2020-07-11 20:24:28 · 178 阅读 · 0 评论 -
【c++ Primier】第九章 顺序容器
1. 定义及类型顺序容器将单一类型元素聚集起来成为容器,然后根据位置来存储和访问这些元素,这就是顺序容器。 顺序容器类型有:vector,list和deque。顺序容器适配器包括:stack,queue,priority_queue。 所有容器类型都定义了默认构造函数,用于创建指定类型的空容器对象。默认构造函数不带参数。三种顺序容器必须包含的头文件如下:#include<vector>#include<list>#include<deque>2. 容原创 2020-07-11 19:20:08 · 206 阅读 · 0 评论 -
【c++ Primier】第三章 标准库类型--string,vector以及bitset
string(1)几种初始化string对象的方式:string s1; 默认构造函数,s1为空串string s2(s1); 将s2初始化为s1的一个副本string s3("value"); 将s3初始化为一个字符串字面值副本string s4(n, 'c'); 将s4初始化为字符'c'的n个副本string s(cp); 用cp指向的C风格字符串初始化该对象。string s(cp,n); 初始化为cp所指向数组的前n个元素string s(s2,pos); 初始化为字符原创 2020-07-07 17:14:38 · 206 阅读 · 0 评论