杂记2(指各种知识)

简介: 杂记2(指各种知识)

移动构造和移动赋值函数重载/函数重写/函数重定义

虚函数是什么?

非静态成员函数前加virtual  

如何实现多态?

派生类+virtual 返回值 函数名 参数一致(除协变) 改写内容 虚函数表(重写/覆盖) 切片 虚函数指针 虚表 虚函数地址

多态的原理

虚函数表 切片  

重写后 生成虚函数指针 指向 虚函数表 存的是虚函数的地址

纯虚函数

=0

抽象类

类中有纯虚函数的类 没法创建对象 除非继承它的子类 重写纯虚函数

什么是重定义?

基类/派生类 同名函数 不构成重写的函数

为什么构造函数不能是虚函数? 虚函数--内存

为什么析构函数要是虚函数?

输入/输出(结果未知,需要函数给结果的参数)/输入输出型参数  const&/*/&

substr?sub(pos,lenth) 从pos位置开始 切lenth个字符        

string substr (size_t pos = 0, size_t len = npos) const;这个const修饰的是谁?

这个const表示,函数体内的任何变量都不能被修改。

静态成员在类中的特点?

1.为本类型所有对象所共有

在类未实例化时,非静态函数可以调用静态成员吗?可以,但静态变量要在类外定义  注意:静态成员变量在类中仅仅是一个声明,类实例化时也不会对静态成员实例化,所以要在类外定义

在类中,只要没有实例化,除了静态成员函数外,类中所有成员都只是声明

静态成员函数:只能调用静态成员变量(在类外经过定义的)/函数

静态成员变量:类中声明 类外定义

友元函数的特点?

1.友元函数所在类要在上方

2.友元函数要在类内声明,类外定义(编译器问题)

class B {
public:
    void testB();//声明
};
class A {
private:
    friend void B::testB();
    void testA()
    {
        std::cout << "a:" << a << std::endl;
    }
private:
    int a=0;
};
void B::testB()//定义
{
    A a;
    a.testA();
}

Linux文件权限

- --- --- ---

类型 拥有者权限 拥有者所在组权限 other权限

文件实际权限=mask&(~umask) ||||  文件mask=0666 文件夹mask=0777     |||umask=002(八进制)(八进制一位可以表示3位二进制)

chmod u/g/o/a +r/w/x 文件名/文件目录

僵尸进程与孤儿进程

僵尸进程(是一个数据结构,保留了pid,退出状态等等)--父进程未exit,但没有调用wait/waitpid,而子进程退出了(子进程所占用的资源释放了),子进程成为僵尸进程,其包含的信息无法得到释放。

孤儿进程:父进程退出了,子进程仍在运行,则子进程被init进程领养,成为孤儿进程

const与*

const在*左,修饰的是指针指向的内容

const在*右,修饰的是指针本身    

计算结构体大小

对齐数    min(成员对齐数,默认对齐数)

最大对齐数    max(成员对齐数)

结构体嵌套结构体?(将嵌套的结构体看作成员对待)

     

struct {                            
            int a;
            float b;
            struct
            {
                char a1;
                int b1;
                double c;
            };
        }s;
        ------------------
        struct {
            int a;
            float b;
                char a1;
                int b1;
                double c;
        }s;


守护进程如何实现的?为什么要忽略信号?

自成进程组 自成会话的进程,称为守护进程

1.忽略信号---SIGNAL(SIGCHILD,SIG_IGN)(子进程由内核回收)SIGNAL(SIGPIPE,SIG_IGN)(如果client端关闭,不让server端执行SIGPIPE的默认动作(终止进程))

2.fork

3.setsid

4.设置工作目录

std::bind?

堆:

向下调整:条件(左右子树必须是堆结构)

使用场景:

堆的删除(指堆顶元素与堆尾元素交换,并对新的堆顶元素使用向下调整)why?

直接删除堆顶元素-->左右子树失序-->(向下)重新建堆-->时间复杂度=O(N) |||| 交换元素-->左右仍为堆结构-->向下调整算法调整堆结构-->时间复杂度=O(log(n))

向下调整建堆(从最后一个非空叶子结点开始)

向上调整:

使用场景:

向堆中插入元素,使用向上调整算法调整堆结构 时间复杂度 O(log(n))

虚拟存储??即虚拟地址空间 为什么有?直接访问物理地址篡改内存数据 || 直接分配物理地址 ,进程很多 内存不够

代码区 静态存储区 BSS 堆区 共享区 栈区 内核空间

32位机器 3GB 用户 1GB内核 保留区  

OS管理->task_struct(PCB)->管理进程

活锁是什么??

页框是什么??物理内存的一个基本单位 4KB

snprintf的用法?

int snprintf ( char * s, size_t n, const char * format, ... );

将n个字节的内容,按照format("wo shi ni die %s %s")的格式,往s指向的缓冲区里面存储,...是可变参数,个数与format中的格式标识符(%s %d)数量一致

vsnprintf的用法?(vsnprintf上一层必须是 (const char* format,...))

int vsnprintf (char * s, size_t n, const char * format, va_list arg );

将n个字节的内容,按照format("wo shi ni die %s %s")的格式,往s指向的缓冲区里面存储,

可变参数?

char argv[10]与char*?

数组名是指向首元素的地址,数组名的类型取决于数组元素的类型 例如 char argv[10]指向 char 所以它的类型是char*

&数组名,表示的是取整个数组的地址 ,这个地址的类型是char[10]*

缓存的使用场景??

信号量??

对临界资源做更细粒度的管理

什么是序列化什么是反序列化?

快速排序

归并排序

%两边必须是整数

智能指针具体是如何实现的?above

是一个类模板

类成员有一个模板类型的指针 T* ptr

构造函数传入指针,使用该指针对模板类型的指针初始化(即赋值)

析构函数 delete ptr

为了让这个类模板与正常指针使用无异,会对运算符重载

T* operator->()  T& operator *()

智能指针的具体类型

1.auto_ptr 已经被废弃 c++98

why?当多个auto_ptr指向同一个对象时,无法判断auto_ptr是否有对该对象的拥有权?允许拥有权的转移多次析构问题

2.unique_ptr c++11  为了解决auto_ptr的问题 独占智能指针 一个对象只能被一个智能指针指向

拷贝构造/与赋值运算被delete了

可以移动赋值(by转移所有权)鸡肋

移动构造是啥?explicit 是? noexcept是?

3.shared_ptr 一个对象被多个智能指针所指向 它是如何做到的

它通过引用计数 解决的是赋值时 多个sp指向同一个对象 而造成重复析构的问题,但是不能解决初始化时的如下场景

   test* a = new test();

   tsj::shared_ptr p1(a);

   tsj::shared_ptr p2(a);

循环引用问题 怎么造成的?例如: 两个双向链表,相互引用 两个类

4.为了解决上述问题,专门引入了weak_ptr 如何实现的?不是RAII智能指针 ,当存在循环引用的问题时,就使用weakptr

引用计数 不++/--  不管理资源、

类默认会生成什么函数?

构造 析构 拷贝构造 赋值重载 取地址/const取地址的重载

空类的大小是多少?为什么

1

如果空类为0,就意味着它在没有存储在内存中,没有地址,那么就无法实例化对象。找不到

地址冲突,如果两个空类都为0,实例化对象可能会被分配到同一地址,不符合对象地址唯一性

类中隐形的存储了其他信息 例如类型信息、虚函数表指针等

引用的原理?左值引用和右值引用(移动构造)

vector    迭代器失效

list

hashtable

unordered_map/unordered_set 底层是哈希表/哈希桶

unordered_map/unordered_set 不支持重复元素插入  减少哈希冲突 提高索引效率

单例模式:确保类只有一个实例。在内存中只创建一个该类的实例,在程序中多次使用同一个对象且作用相同,有需要调用的地方都共享这一单例对象,节省内存

懒汉模式    判断类是否进行实例化,yes->返回该类的实例 no->类实例化,返回类实例

饿汉模式    类加载时已经创建好了实例对象,等待程序调用

引入锁,确保只创建了一个实例 double check提高效率

网络字节序

不同的主机存在 大端-小端 数据存储的方式

网络数据在放送的时候统一以大端方式发送 高位低地址

发送:

小端机:将数据按大端方式发送

接收:  

小端机:将数据转成小端

序列化 网络传输时,数据以二进制方式传送

反序列化 上层获取数据时,将二进制内容转换成应用层能识别的格式

AVL树/红黑树

AVL:

平衡二叉树,

LL:左旋

RR:右旋

LR

RL

static 修饰

局部变量    生命周期延长了    生命周期随所在源文件

全局变量    外部链接属性-->内部链接属性 只能在所在源文件使用 生命周期随程序

函数        外部链接属性-->内部链接属性 只能在所在源文件使用 生命周期随所在源文件

移动构造的本质:将一个对象(右值类型,即将亡值)的资源转移给另一个对象,是一种浅拷贝,移动构造函数通常使用右值引用作为参数

左值:可以取地址的值,可以被修改的值,左值指的是那些可以出现在赋值语句左边的表达式

右值:不能取地址,不可被修改的值,例如常量、临时变量、匿名对象,右值则是指那些不能出现在赋值语句左边的表达式

string与vector的迭代器底层是指针,因为他们的底层空间是连续的

list迭代器底层是迭代器类,是对结点指针的封装,因为list的底层空间是不连续的,而迭代器的意义就是让使用者不关心底层结构,可以用简单统一的方式对容器内的数据进行访问。

菱形继承的形态?

多态 1.虚函数覆盖 2.父类指针/引用调用

虚函数表指针->虚函数表->函数地址 父类指针或引用调用虚函数 为什么?切片 可以是父类对象吗?不能因为, 切片时调用的时拷贝构造,父类对象的虚表指针永远指向的是父类的虚函数表

菱形虚拟继承 虚基表指针->虚基表->当前类对象位置距离公共虚基类的偏移量

关于将析构函数设置为虚函数

1.不这样设置可能会导致资源泄露

2.设置成了虚函数后 编译器会调用子类的析构函数(虚函数表),编译器行为,为了保证多态<当你执行 delete ptr; 时,由于基类的析构函数是虚函数,因此程序会在运行时识别出 ptr 指向的是子类对象,并调用子类的析构函数来正确释放该对象的资源。>

不设置的话只会调用父类的析构函数 虚函数间不构成多态,对象类型是什么就调用谁的虚函数,跟类型有关

析构函数不会被继承

位图  templateclass{vector}

布隆过滤器 使用多个hash函数的位图 string to int hash冲突

哈希切分 就是利用hash函数 将大文件切成一个个小文件

unordered_set?

相关文章
|
SQL 自然语言处理 监控
PostgreSQL插件汇总
一专多长的数据库——PostgreSQL
3279 0
std::atomic和std::mutex区别
模板类std::atomic是C++11提供的原子操作类型,头文件 #include<atomic>。在多线程调用下,利用std::atomic可实现数据结构的无锁设计。
347 2
|
7月前
|
设计模式 数据采集 算法
【设计模式】【行为型模式】模板方法模式(Template Method)
一、入门 1.1、什么是模板方法模式? 模板模式(Template Method Pattern)是一种行为设计模式,它定义了一个算法的框架,并允许子类在不改变算法结构的情况下重新定义算法的某些步骤。
263 13
|
9月前
|
存储 算法 C++
【c++丨STL】set/multiset的使用
本文深入解析了STL中的`set`和`multiset`容器,二者均为关联式容器,底层基于红黑树实现。`set`支持唯一性元素存储并自动排序,适用于高效查找场景;`multiset`允许重复元素。两者均具备O(logN)的插入、删除与查找复杂度。文章详细介绍了构造函数、迭代器、容量接口、增删操作(如`insert`、`erase`)、查找统计(如`find`、`count`)及`multiset`特有的区间操作(如`lower_bound`、`upper_bound`、`equal_range`)。最后预告了`map`容器的学习,其作为键值对存储的关联式容器,同样基于红黑树,具有高效操作特性。
412 3
|
机器学习/深度学习 人工智能 自然语言处理
Transformer图解
Transformer 是一种在自然语言处理(NLP)领域广泛使用的模型架构该模型通过Self-Attention机制和位置编码技术替代传统的RNN结构,实现了并行处理和更有效的长距离依赖捕捉。Transformer主要由编码器(Encoder)和解码器(Decoder)两部分组成,其中编码器负责处理输入序列,解码器则基于编码器的输出生成目标序列。每一层的编码器和解码器内部均采用多头注意力机制(Multi-Head Attention)、前馈神经网络以及残差连接和归一化层,以增强模型的学习能力和稳定性。此外,位置编码的引入使得模型能够在处理无序的输入序列时保留词语的位置信息。
578 13
|
开发框架 Java .NET
.net core 非阻塞的异步编程 及 线程调度过程
【11月更文挑战第12天】本文介绍了.NET Core中的非阻塞异步编程,包括其基本概念、实现方式及应用示例。通过`async`和`await`关键字,程序可在等待I/O操作时保持线程不被阻塞,提高性能。文章还详细说明了异步方法的基础示例、线程调度过程、延续任务机制、同步上下文的作用以及如何使用`Task.WhenAll`和`Task.WhenAny`处理多个异步任务的并发执行。
308 1
|
安全 Java 程序员
Java中的异常处理:深入理解try-catch-finally
在Java编程的海洋中,异常处理如同航行中的避风港,为程序的安全运行提供保障。本文将带你领略try-catch-finally结构的风采,从浅入深地探索异常处理的奥秘,让你在面对程序中的风浪时,能稳握舵盘,驾驭异常。
|
存储 缓存 算法
一篇文章让你学会什么是哈希(上)
哈希概念 哈希在C++中有广泛的应用,它是一种用于快速查找和存储数据的数据结构和算法。以下是一些常见的哈希在C++中的应用: 哈希表(Hash Table):哈希表是一种高效的数据结构,用于存储键值对。在C++中,std::unordered_map 和 std::unordered_set 是标准库提供的哈希表实现。
|
存储 安全
atomic_int
atomic_int
670 0
|
开发框架 监控 Java
【.NET Core】多线程之线程池(ThreadPool)详解(二)
【.NET Core】多线程之线程池(ThreadPool)详解(二)
345 3