此博客主要用于面试展示,大部分内容为大|

修竹Kirakira

园龄:2年11个月粉丝:13关注:0

随笔分类 -  C++基础(涉及一些底层知识)

mainCRTStartup 函数解析
摘要:mainCRTStartup函数解析 操作系统装载应用程序后,做完初始化工作就转到程序的入口点执行。程序的默认入口点由连接程序设置, 不同的连接器选择的入口函数也不尽相同。在VC++下,连接器对控制台程序设置的入口函数是 mainCRTStartup,mainCRTStartup 再调用main 函
732
0
1
虚继承
摘要:1. 菱形继承 1)概念 ​ B,C继承自A,D继承自B,C 2)问题 ​ 一个派生类中保留间接基类的多份同名成员,可能出现命名冲突和冗余数据问题 2. 虚继承 c++代码示例: #include <stdio.h> //定义家具类,虚基类,等同于类A class Furniture { publi
50
0
0
抽象类
摘要:1. 纯虚函数 1)概念 ​ 在虚函数的声明结尾处添加“=0”,这种虚函数被称为纯虚函数,是一个没有实现只有声明的函数 2)作用 ​ 为了让类具有抽象类的功能,让继承自抽象类的子类都具有虚表以及虚表指针 3)纯虚函数在虚表中的处理 ​ 因为纯虚函数没有实现代码,所以没有首地址。编译器为了防止误调用纯
22
0
0
继承和多重继承
摘要:一、继承的基本概念 ​ 继承:子类继承父类的属性和行为 ​ 作用:代码复用 继承分类: 1. 按访问属性分为public、private、protected三类 1)public: 父类属性无更改,pubic, private, protected 仍是自己本身(子类成员函数可以访问父类的publi
161
0
0
虚函数(涉及汇编原理)
摘要:虚函数 1. 多态 ​ 对象的多态性需要通过虚表和虚表指针来完成 2. 虚表指针 1)位置 ​ 定义在对象首地址的前4字节处(32位)或前8个字节(64位)处 2)定义 ​ 一个二维指针,一个存储一个或多个虚函数地址的数组的数组名,类中的隐藏数据成员 3)初始化 ​ 通过编译器在构造函数内插入代码来
85
0
0
析构函数和构造函数的特点(在汇编中如何识别构造和析构)
摘要:1. 构造函数 1.1 概念 ​ 常用来完成对象生成时的数据初始化工作,支持函数重载,不可定义返回值,返回值为对象首地址,即this指针 拷贝构造函数:参数为对象地址,返回值为this指针 1.2 构造函数的调用时机 1.2.1 局部对象 在汇编里,关于局部对象的构造函数的识别的充分条件和必要条件
112
0
0
对象(探讨对象不适合作为参数和返回值,对象的指针可以的原因)
摘要:对象 ​ 类的一个实例化。对象中的成员定义从低地址到高地址 1. 对象作为函数参数 ​ 对象传参时先将对象中的所有数据进行备份(复制),将复制的数据作为形参传递到调用函数中使用 隐患:拷贝数据中有申请的内存空间,浅拷贝只会拷贝地址不会拷贝数据,在调用函数中会调用一次析构函数释放复制出来的临时对象,在
25
0
0
摘要:class 1. 概念 ​ 一组具有相同属性和行为的对象的集合,体现了面向对象的抽象和封装的两个特点 2. 语法: typedef class _MyClass_{ }; 3. C++四大特性 抽象:数据抽象,过程抽象,只关注目标有什么特点,不在意具体实现 封装:即隐藏对象的属性和实现细节,仅对外公
28
0
0
new和malloc的区别
摘要:从表层调用来看: 1. 名称/语法 一个是操作符,一个是调用函数(cdecl) int *v1 = new int;//无需指定内存块的大小 int *v2 = (int*)malloc(sizeof(int));//需显式指出内存块的大小 delete v1; free(v1); 2. 申请内存
70
0
0
[3] 以逆向的角度来看循环语句——do、while、for的比较
摘要:[3] 以逆向的角度来看循环语句——do、while、for的比较 1. do循环 ​ 先执行循环体,后比较判断 #include <stdio.h> int main(int argc, char* argv[]) { int sum = 0; int i = 0; do { sum += i;
44
0
0
[2] 以逆向的角度来看流程控制语句——switch
摘要:[2] 以逆向的角度来看流程控制语句——switch 1. switch分支数小于4 汇编标识: 00401021 mov [ebp-4], ecx 00401024 cmp dword ptr [ebp-4], 1 00401028 jz short loc_401038 ;如果n==1,跳转到c
71
0
0
[1] 以逆向的角度来看流程控制语句——if
摘要:[1] 以逆向的角度来看流程控制语句——if 1. if语句(单分支) ​ if语句转换的条件跳转指令与if语句的判断结果是相反的, 因为C语言是根据代码行的位置决定编译后二进制代码地址高低的,即低行数对应低地址,高行数对应高地址 ​ 汇编标识: 00401003 cmp dword ptr [eb
39
0
0
引用
摘要:引用 1. 概念 ​ C++为了简化操作,对指针的操作进行了封装,产生了引用类型。引用类型实际上就是指针类型,只不过用于存放地址的内存空间对使用者而言是隐藏的。由于语法限制,导致在输出v2的时候,默认编译器有一个取*的操作,所以输出为值 2. 语法 int v1=10; int &v2=v1; in
38
0
0
指针(涉及一些底层知识)
摘要:指针 1. 指针种类 *一维指针 **(multiply)二维或多维指针 [*]指针数组 (*)[]数组指针 lpfn函数指针 void*指针函数 2. 一维指针 2.1 概念 ​ 用来存放内存地址的变量 2.2 用途 2.2.1 访问内存 ​ 所有数据类型都有相应的指针 char wchar in
55
0
0
调用约定
摘要:调用约定 1. x86 体系 ​ x86 体系下有四种调用约定 1.1 四种调用约定的区别 | 调用约定 | __cdecl | __stdcall | __fastcall | __thiscall | | | | | | | | 调用规范 | int __cdecl function(int a
98
0
0
递归
摘要:递归 1. 概念 ​ 自己调用自己 2. 条件 ​ 必须有if退出条件语句,且在递归代码段之前 一般退出条件里是全局变量 3. 递归使用方法 1)函数主要执行代码在递归块之前(和for循环差不多) 2)将函数执行代码放在递归块之后 此方法相当于:到最后一层达到退出条件,返回上一层,再执行代码 普通循
23
0
0
变量
摘要:变量 变量在内存中的位置和访问方式 位置 ​ 在属性为可读写的数据节中 访问方式 ​ 栈内存:ebp-- ebp++ ​ 堆内存:间接访问 ​ 全局变量存储区:使用offset寻址 ​ 常量区:使用offset寻址 全局变量 ​ 位置:所在地址为数据区 ​ 生命周期:与所在模块一致,在程序执行前都已
31
0
0
常量
摘要:常量 常量概念 ​ 在程序运行前就已经存在,它们被编译到可执行文件 中,当程序启动后,它们便会被加载进来。这些数据通常都会保存在 常量数据区中,该区的属性没有写权限。 常量定义 1. #define定义常量 ​ 编译器在对其进行编译时,会将代码中的宏名称替换成对应信息。宏的使用可以增加代码的可读性
33
0
0
关于 const
摘要:const 限定符 在编译器中限制变量,设定该变量不可被改变,但实际上系统里还是将由 const 修饰的值识别为一个变量(只是在编译器中进行限制) 注意: 由 const 修饰的变量必须在定义时就进行初始化 const 和引用 对常量的引用:不能被用作修改他所绑定的对象,可以指向一个常量对象,也可以
16
0
0
结构体定义及结构体粒度(alignment)
摘要:结构体定义及结构体粒度(alignment) #pragma pack(1) typedef struct _STUDENT_INFORMATION_ { int Age; char v1; int v3; char v2; }STUDENT_INFORMATION; 结构体的成员对齐值: 结构体中
81
0
0
点击右上角即可分享
微信分享提示
深色
回顶
收起