龙空技术网

C++ 学习笔记

劉胡來 180

前言:

现在小伙伴们对“halocss”大约比较注意,你们都想要了解一些“halocss”的相关资讯。那么小编也在网摘上搜集了一些对于“halocss””的相关文章,希望朋友们能喜欢,看官们一起来了解一下吧!

野指针和悬空指针分别是什么 野指针:指的是没有被初始化过的指针。 解决方法:指针变量未及时初始化 => 定义指针变量及时初始化,要么置空。 悬空指针:指针最初指向的内存已经被释放了的一种指针。解决方法:指针free或delete之后没有及时置空 => 释放操作后立即置空

2.C++ 11 新特性

3.智能指针的实现,需要注意什么:

为什么多线程读写 shared_ptr 要加锁?

4.C++ include 中都包含什么东西?如果把函数声明与函数定义都写在头文件中会有什么问题? include 引入头文件其实都会将引入头文件信息引入到当前文件,如果在头文件写函数声明 当多次引入时可能会造成重复定义

5.红黑树是什么样的数据结构?红黑树和B数的区别?

6、结构体struct和联合体union的区别

1.定义: 结构体struct:把不同类型的数据组合成一个整体,自定义类型。 共同体union: 使几个不同类型的变量共同占用一段内存。

2.地址: struct和union都有内存对齐,结构体的内存布局依赖于CPU、操作系统、编译器及编译时的对齐选项。

具体参考:

7、C和C++的特点与区别(注意本质区别)

8、C++中基类的析构函数为什么要用virtual虚析构函数(重要知识点)

9、C++ 类的内存布局是什么样的 (重要知识点,注意子类 与基类的内存布局)

10、C++ 内存结构及管理(注意与java 内存模型的对比)

C++ 内存模型:栈区:由编译器自动分配释放,存放为函数运行的局部变量,函数参数,返回数据,返回地址等。操作方式与数据结构中的类似。堆区:一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。分配方式类似于链表全局数据区:也叫做静态区,存放全局变量,静态数据。程序结束后由系统释放文字常量区:可以理解为常量区,常量字符串存放这里。程序结束后由系统释放程序代码区:存放函数体的二进制代码。但是代码段中也分为代码段和数据段。关于文字常量区 文字常量区,在大多数解释中,都仅仅说明常量字符串存放这里。但是如果深究字眼,那么其他常量比如整型是否存放这里呢?我查阅了一些资料,是这么解释的:常量之所以称为“文字常量”,其中“文字”是指我们只能以它的值的形式指代它,“常量”是指它的值是不可变的。同时注意一点:文字常量是不可寻址的(即我们的程序中不可能出现获取所谓常量20的存储地址&20这样的表达式),虽然常量也是存储在内存的某个地方,但是我们没有办法访问常量的地址的。JAVA内存模型:堆 栈与C++ 基本一致方法区:也称为静态区 线程共享,生命周期与虚拟机相同,可以不使用连续的内存地址存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据运行时常量池存放字面量及符号引用

11、c++ dynamic_cast 实现原理(同时需要理解reinterpret_cast 与static cast转换)

比较4种转换类型:

12、C/C++内存泄漏及检测

13、内存对齐:

14、C++ 函数重载是因为采用了name mangling技术,即在底层将函数再重新命名。

15、STL中常用的容器,map和hashmap底层实现以及应用场景

16、char* 和 string有什么区别?实际中哪一个用的比较多?为什么?从char*聊到网络传输中粘包问题

17、你的项目中如何做的yuv到rgb的变换?为什么不直接用yuv?

yuv是经过压缩的视频信号,要还原成可以处理的数字信号,得必须转换

18、正确区分重载、重写和隐藏。

注意三个概念的适用范围:处在同一个类中的函数才会出现重载。处在父类和子类中的函数才会出现重写和隐藏。重载(overload):同一类中,函数名相同,但参数列表不同。重写/覆盖(override):父子类中,函数名相同,参数列表相同,且有virtual修饰。隐藏(overwrite):父子类中,函数名相同,参数列表相同,但没有virtual修饰;函数名相同,参数列表不同,无论有无virtual修饰都是隐藏 基类中:      (1) virtual void show(); //是虚函数      (2) void show(int);     //不是虚函数子类中:(3) void show();        //是虚函数      (4) void show(int);     //不是虚函数

1,2构成重载,3,4构成重载,1,3构成重写,2,4构成隐藏。另外2,3也会构成隐藏,子类对象无法访问基类的void show(int)成员方法,但是由于子类中4的存在导致了子类对象也可以直接调用void show(int)函数,不过此时调用的函数不在是基类中定义的void show(int)函数2,而是子类中的与3重载的4号函数。

19、switch/case 与if /else 对比

20、C++:构造函数和析构函数能否为虚函数

构造函数不能为虚函数:

存储空间角度:虚函数对应一个vtable,vtable存储于对象的内存空间若构造函数是虚的,则需要通过 vtable来调用,若对象还未实例化,即内存空间还没有,无法找到vtable

使用角度:虚函数主要用于在信息不全的情况下,能使重载的函数得到对应的调用。构造函数本身就是要初始化实例,那使用虚函数就没有实际意义

从实际含义上看,在调用构造函数时还不能确定对象的真实类型(因为子类会调父类的构造函数);而且构造函数的作用是提供初始化,在对象生命期只执行一次,不是对象的动态行为,也没有太大的必要成为虚函数**

21、STL Vector 底层实现原理

22、C++ 是如何检查指针越界的?

23、C++中的RVO优化和NRVO优化

24、C++ 模版实现原理

其他人总结的:

C++ 学习笔记1.#include 重复引入的解决方法ifndef #define # endif 可以处理重复包含的问题,可以针对代码块pragram once 也可以屏蔽重复include的问题,不过 是针对 整个文件2.内联函数 inline function执行效率变高,原因:不再开辟函数 栈空间,直接使用函数实现进行了内联函数 声明规则:

函数体积不大

频繁调用的函数 (因为可以节约函数栈空开辟的时间)

3.宏替换也有提升效率的作用4.析构函数中不需要手动释放对象的基本类型成员变量,但是需要手动释放对象类型的成员变量,即堆空间对象5.对象内部申请的堆空间由对象内部回收

6.在构造器再次调用构造器,如果初次的构造器是在栈空间调用的话,那么此处调用的构造函数有可能在栈空间创建,即是一个临时对象,临时对象的生命周期很短如下面代码:

class Person{  int m_age;  public:    Person(){      Person(18); //此处如果 Person() 是在 栈上创建的 那么 创建的Person(18) 对象为临时对象,创建的m_age 并不会赋值给this.m_age      }        Person(int age) {      m_age = age;    }  }
6.C++ 多态是通虚函数实现,在类中会多一个虚表指针,指向虚表,虚表中存放虚函数的地址7.虚继承内存分布:首先存入虚表指针,虚表指向虚表。虚表中存入两个对象:对象一:虚表指针与本类起始的偏移量,因为虚表指针通常是放在本类对象内存空间的起始处所以它的值通常为0对象二:虚基类第一个成员变量与本类起始的偏移量,在本类中,虚继承来的父类成员变量是放在本类成员变量之后的,示例:class Person{

int age = 1;

}

class Student : virtual public Person {

int score = 0;

}

class Work : virtual public Person {

int salary = 0;

}

class Freshmen : public Person,public Work{

int grade = 0;

}student 内存分布如下

Freshmen 内存分布

h265 码流结构

标签: #halocss