[TOC]
1. 判断一段程序是什么编译器编译
如果编译器在编译cpp文件,那么`_cplusplus`就会被定义,如果是一个C文件被编译,那么`_STDC_`就会被定义,`_STDC_`是预定义宏,当它被定义后,编译器将按照ANSIC标准来编译C语言程序。
2. C++函数中值的传递方式
* 按值传递(pass by value)
* 地址传递(pass by pointer)
* 引用传递(pass by reference)
按值传递方式容易理解,但形参值的改变不能对实参产生影响。
` `
地址传递方式虽然可以使得形参的改变对相应的实参有效,但如果在函数中反复利用指针进行间接访问,会使程序容易产生错误且难以阅读。
` `
如果以引用为参数,则既可以使得对形参的任何操作都能改变相应的数据,又使得函数调用显得方便、自然。引用传递方式是在函数定义时在形参前面加上引用运算符“&”。
3. C++中虚函数问题
4. C++和C有什么不同
语法
特性
场景
效率
C:面向过程,效率高,嵌入式。如linux核心大部分是C写的
C++:面向对象。更上层,更复杂。增加里模版泛型。
5. C和C++中struct有什么区别
| | Protection行为 | 能否定义函数 |
| --- | --- | --- | --- |
| C | 无 | 否,但可以有函数指针 |
| C ++ | 有,默认是public | 可以 |
6. C++中struct和class有什么区别
区别在于权限问题上。
class和struct 做类型定义时只有两点区别:
1)默认继承权限。如果不明确指定,来自class的继承按照private继承处理,来自struct的继承按照public继承处理
2)成员的默认访问权限。class的成员默认是private,struct默认是public权限。
7. int id[sizeof(unsigned long];这个对吗?为什么?
正确
这个sizeof是编译时运算符,编译时就确定里可以看成和机器有关的变量。sizeof(unsigned long]) 确定的常量。
8. new in c++ is a: **key word** and **operator**
9. 变量的指针含意是指变量的**地址**
10. 多态的作用
- 1.隐藏实现细节,是的代码能够模块化;扩展代码模块,实现代码重用
- 2.接口重用:为了类在继承和派生的时候,保证使用家族中任一类的实例的某一属性时的正确调用。
11. 多态类中的虚函数表是Complie-Time,还是Run-Time时建立的?
虚函数表是在编译时期就建立类,各个虚拟函数这时被组织成类一个虚拟函数的入口地址的数组,而对象的隐藏成员--虚拟函数表指针是在运行期--也就是构造函数被调用时进行初始化的,这是实现多态的关键。
12. 面向对象的三个基本特征,并简单叙述之
封装:将客观事物抽象成类,每个类对自身的数据和方法是想protection(private,protected,public)
继承:广义的继承有三种实现形式:实现继承、可视继承、接口继承。前两种和后一种构成类功能复用的两种方式。
多态:是将父类对象设置成为和一个或更多的与他的自对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特征以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。
是什么?
怎么用?
为什么使用它?
13. 内联函数在编译时是否做参数类型检查
内联函数要做参数检查,这his内联函数跟宏相比的优势。
14. 内存的分配方式有几种
1) 静态存储区域。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量。
2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,到那时分配的内存容量有限。
3)从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。
15. 对于一个频繁使用但短小函数,在C语言中应用什么实现,在C++中应用什么实现》
C用宏定义,C++用inline
16. 全局变量和局部变量有什么区别?是怎么实现的?操作系统和编译器是怎么知道的?
生命周期:全局变量随主程序创建而创建,随主程序销毁而销毁;局部变量在局部函数内部,甚至局部循环体等内部存在,退出就不存在;
使用方式不同:通过声明后全局变量程序的各个部分都可以用到,放在静态数据区;局部变量只能在局部使用;分配在栈区。
操作系统和编译器通过内存分配的位置来知道的,全局变量分配在全局数据段并且在程序开始运行的时候被加载。局部变量则分配在堆栈里。
17. 如果在申请动态内存时找不到足够大的内存快,malloc和new将返回NULL指针,宣告内存申请失败。你是怎么处理内存耗尽的?
如果返回nULL则什么都不做
18. 用C++写一个程序,如何判断一个操作系统是16位还是32位的?
标准答案:定义一个指针p。打印出sizeof(p),如果打印结果是4,则表示该操作系统是32位,打印结果是2,表示是16位。计算指针变量
19. 不用sizeof() 判断操作系统是16位还是32位。
```
unsign int a = ~0;
if (a > 65536)
{
cout << "32 bit" << endl;
}
else
{
cout << "16 bit" << endl;
}
// 在64位操作系统中该方法不适合。需要用sizeof(指针)来计算
```
20. 为什么需要使用堆,使用堆空间的原因?
直到运行时才知道一个对象需要多少内存空间;不知道对象的生存周期到底有多长。
21. 若数组名作为实参而指针变量作形参,函数调用实参给形参的是()
数组第一个元素的地址
22. 有来malloc/free,为什么还要用new-delete
malloc/free是C++/C语言的标准库函数,new/delete是C++的运算符。他们都可以用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用malloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能把执行构造函数和析构函数的任务强加于malloc/free. 因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。
23.为什么数组名作为参数,会改变数组的内容,而其他类型如int却不会改变变量的值?
数组传递的是首元素的地址。
24。请讲一讲析构函数和虚函数的用法和作用
析构函数是特殊的类成员函数,它没有返回类型,没有参数,不能显示调用,也没有重载,只有在类对象的生命周期结束的时候,由系统自动调用。有释放内存空间的作用。
可以是虚析构函数。
虚函数是C++多态的一种表现,使用虚函数,我们可以灵活的进行动态绑定,当然是以一定的开销为代价。
25. 错误的转义字符('091')
'\091' '\\' '\0' '\'
26. 如果ClassA中定义并实现虚函数int func(void), ClassB中也实现该函数,那么上述变量a->func()将调用哪个类里面的函数? 如果int func(void)不是虚函数,情况又如何?为什么?
第一问调用的是B的。第二问调用A的。虚函数的第一个典型应用。**虚函数只能借助于指针或者引用来达到多态的效果**。
27. 引用与指针有什么区别?
参考答案:
1)引用必须被初始化,指针不必
2)(引用初始化后不能被改变),指针可以改变所指的对象。
3)不存在只想空值的引用,但是存在指向空值的指针。
28. 你觉得如果不使用常量,直接在程序中填写数字或字符串,将会有什么麻烦?
1)程序的可读性变差。程序员自己会忘记那些数字或字符串是什么意思,用户则更加不知他们从何而来、表示什么。
2)在程序的很多地方输入同样的数字或字符串,难保不发生书写错误。
3)如果要修改数字或字符串,则会在很多地方改动,既麻烦又容易出错。
29. 在C++中有没有纯虚构造函数?
构造函数不能是虚的,只有虚的析构函数。构造函数需要指定数据类型。
30. 重复多次fclose 一个打开过一次的FILE*fp指针会有什么结果,并请解释。
考察点:导致文件描述符结构中指针指向的内存被重复释放,进而导致一些不可预期的异常。
31.重载和重写、重定义(覆盖)的区别
重载:在同一个类中。是允许存在多个同名函数,而这些函数的参数表不同。
重写:在继承链中,派生类与基类函数同名,屏蔽基类的函数(虚函数)
覆盖:不同名字空间,用于继承,子类重新定义复类虚函数的方法
32. C++是不是类型安全的?
不是。两个不同类型的指针之间可以强制转换(用reinterpret cast).
33. C++里是不是所有的动作都是main()引起的?如果不是,请距离
比如全局变量的初始化,就不是由main函数引起的。
34. main函数执行之前,还会执行什么代码》
全局对象的构造函数会在main函数之前执行
35. C++中virtual与inline的含义分别是什么?
在基类成员函数的声明加上virtual关键字,意味着将该成员函数声明为虚函数。inline与函数的定义体放在一起,使该函数称为内联。inline是一种用于实现的关键字,而不是用于声明的关键字。
虚函数的特点;用于多态、纯虚函数(抽象类)。如果希望派生类能够重新定义基类的方法,则在基类中将该方法定义为虚方法,这样可以启动动态联编。
内联函数的特点;使用内联函数的目的是为里提高函数的运行效率。内联函数体的代码不能过长,因为内联函数省去调用函数的时间是以代码膨胀为代价的。内联函数不能包含循环语句,因为执行循环语句要比调用函数的开销大。
36. const关键字?有哪些作用
1)欲阻止一个变量被改变,可以使用const关键字。在定义该const变量时,通常需要对它进行初始化,因为以后就没有机会再去改变它里;
2)对指针来说,可以指定指针本身为const,也可以指定指针所指对数据为const,或二者同时指定为const;
3)在一个函数声明中,const可以修饰形参,表明他是一个输入参数,在函数内部不能改变其值;
4)对于类成员函数,若指定其为const类型,则表明其是一个常函数,不能修改类对成员变量;
5)对于类对成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值“。
37. VC中,编译工具条内对Debug与Release选项是什么含义?
Debug:会额外新增一些可调式的符号。
Release:把运行不相关的信息剔除掉。发布版本
38. 是不是一个父类写类一个virtual函数,如果子类覆盖它的函数不加virtual,也能实现多态?
virtual修饰符会被隐形继承。virtual可加可不加。子类的空间里有父类的所有变量(static除外)。同一个函数只存在一个实体(inline除外)。子类覆盖它的函数不加virtual,也能实现多态。在子类的空间里,有父类的私有变量。私有变量不能直接访问。
39. 一个栈的入栈序列是A,B,C,D,E,则栈的不可能的输出顺序是(DCEAB)。
栈:后进先出
40. 在不用第三方参数的情况下,交换两个参数的值。
```
一:
a = a+b;
b = a - b;
a = a - b;
二:
异或:
```
41.打印当前源文件的文件名以及源文件的当前行号?
```
//使用预定义的两个宏
cout << __FILE__;
cout << __LINE__;
```
42. 当一个类A中没有声明任何成员变量与成员函数,这时sizeof(A)的值为1
43. 下面的函数实现在一个固定的数上加上一个数,有什么错误。
```
int add_n(int n)
{
static int i = 100;
i += n;
return i;
}
解:因为static使得i的值会保留上次的值。以后的i会一直更新,使得第二次调用出现错误。去掉static就可以了。
```
44. 在排序方法中,关键码比较次数与记录地初始排列无关的是(D)
```
A.Shell排序 B.归并排序 C.直接插入排序 D.选择排序
```
45. 函数模版与类模版有什么区别?
函数模版的实例化是由编译程序在处理函数调用时自动完成的,而类模版的实例化必须由程序员在程序中显示的指定。
46、函数重载,我们靠什么来区分调用的那个函数?靠返回值判断可以不可以?
```
不可以。
void Function(void);
int Function(void);
上述两个函数,第一个没有返回值,第二个的返回值是int类型。如果这样调用函数:int x = Function();
则可以判断除Function是第二个函数。问题是在C++/C程序中,我们可以忽略函数的返回值。在这种情况下,编译器和程序员都不知道哪个Function函数被调用。所以只能靠参数而不能靠返回值类型的不同来区分重载函数。
```
47.不能被重载的运算符
1) 不能改变C++内部数据类型(如int,float等)运算符。
2)不能重载‘.‘,因为 在类中对任何成员都有意义,已经成为标准用法。
3)不能重载目前C++运算符集合中没有的符号,如#,@,$等。原因有两点,一是难以理解,二是难以确定优先级。
4)对已经存在的运算符进行重载时,不能改变优先级规则,否则将引起混乱。
48.基类的析构函数不是虚函数,会带来什么问题?
```
class B: class A
{
}
A* a = new B();
delete a;
如果A的析构函数中不是虚函数。则在delete的时候只调用A的析构函数而不会调用B的析构函数。造成内存泄漏。
```
49. 介绍一下模版和容器。如何实现
模版是C++中实现泛型的一种机制
容器是一种特定用途的类
模版可以说比较古老类。但是当前的泛型编程实质上就是模版编程。它体现类了一种通用和泛化的思想
STL 有7种主要容器:
vector,list,deque, map, multimap, set, multiset.
50. 深拷贝和浅拷贝的区别
深拷贝:资源拷贝。意味着拷贝类资源和指针,
浅拷贝:只进行值拷贝。浅拷贝只是拷贝了指针,没有拷贝资源。这样使得两个指针指向同一份资源,造成对同一份析构两次,程序崩溃。临时对象的开销比局部对象小些
- Unity3D
- Unity3D学习路线
- U3D基础
- UGUI
- 数据结构和算法
- 算法时间复杂度
- 二叉树
- B树 & B+树
- 红黑树
- 跳跃表
- Lecod算法题目
- C++-排序算法
- sort排序
- 冒泡排序
- 选择排序
- 插入排序
- 快速排序
- 希尔排序
- 堆排序
- 归并排序
- 递归算法
- LSMs和B tree
- mysql引擎
- 汇编程序
- 汇编入门 Hello World
- 汇编语言整数加减法
- 寄存器的使用和说明
- 汇编语言常用知识点
- 汇编语言中的几个伪指令
- 汇编语言数据类型以及数据定义
- 汇编语言计算数组和字符串长度
- 汇编语言中寄存器加[]的意思
- 汇编语言中$符号的用法
- 汇编语言系统调用(System Calls)
- 汇编语言push和pop指令
- 汇编语言寻址操作
- 汇编语言进阶
- GNUx86-64汇编
- C/C++调用汇编函数
- 用汇编理解C函数的调用过程和返回值
- 从汇编的角度看C++
- C/C++
- C++-编程入门
- C/C++环境搭建
- JsonCPP的使用
- 连接数据库
- 连接mysql
- connector
- C API
- 连接sqlite3
- 使用sqlite3步骤
- 使用Clion
- thread-多线程
- 初识thread
- detach陷阱
- 事实
- 陷阱总结
- 剪切板操作
- 剪切板基本操作
- 剪切板详细api
- 文件操作
- 桌面右键菜单批处理
- Resource Hacker
- 获取指定输入法
- 学习网站
- C++11中的匿名函数(lambda函数,lambda表达式)
- sleep和usleep的区别
- 使用std::unique_ptr 管理 FILE 指针
- typedef的用法
- strtuct中的char*和char数组
- 各个平台不同类型占用字节数
- C++进阶
- C++浅拷贝和深拷贝的区别
- C++类型强制转换
- C++11写的定时器
- C调用java函数
- C++11 特性
- 二进制兼容
- GDB的基础命令
- GDB调试死锁
- 核心底层代码
- 线程池的实现
- 线程池的应用场景
- C++协程库
- C++定时器原理
- 通信协议
- Socket5协议
- https 协议
- TCP-拥塞控制
- C++-STL
- map/unordered_map/hash_map区别
- 初始化vector
- STL算法
- Effective STL
- 条款5:尽量使用区间成员函数代替它们的单元素兄弟
- 条款9:在删除选项中仔细选择
- 条款13:尽量使用vector和string来代替动态分配的数组
- 条款14:使用reserve来避免不必要的重新分配
- 条款16: 如何将vector和string的数据传给遗留的API
- 条款17:使用“交换技巧”来修整过剩容量
- 条款18:避免使用vector<bool>
- 条款30:确保目标区间足够大
- 编辑器
- VS Code
- 配置C++
- 命令行编译
- CMake
- CMake 升级
- cmake-基本操作
- 设置入口
- 修改vs运行时库
- CMake生成sln
- CMake设置输出目录
- CMake添加GDB调试
- 使静态库和动态库同时存在
- C/C++网络编程
- 网络基础
- 5种网络IO模型总结
- 条件变量
- 设置阻塞socket超时时间
- ccnet
- 一个reactor单线程库
- ccnet从单线程转变为多线程
- IO多路复用
- IO多路复用的理解
- EPOLL
- select示例代码
- epoll 示例代码
- iocp示例代码
- muduo库
- muduo编译
- Libevent的简单使用
- 编译libevent
- Libevent几个简单的api
- Libevent 定时器
- Libevent通用的编程技法
- Libevent简单的Server/Client
- Boost库学习
- Boost库编译
- 利用Boost 实现线程池
- boost::asio
- boost::mutex
- Boost解析Json
- Boost.Asio的一些想法
- win32t网络编程
- 简单的c/s socket通信
- 回响
- 迭代服务器跟客户端
- 进行类创建
- socket文件传输
- 简单的udp
- Reactor模型与Proactor模型
- Actor和CSP模型
- 大量的timewait
- EPOLL的bug
- C++-界面
- MFC
- mfc小知识
- MFC吕鑫
- 初识mfc
- 初始化
- 消息映射
- 组合键 与(&)运算
- WIN32+MFC自定义消息
- 对话框的相关消息
- DestroyWindow
- GDI
- 初窥
- 坐标
- 创建画笔
- CDC
- CPaintDC
- CPen
- CBursh
- CFont
- CBitmap
- LoadImage
- CMemDC
- 自适应
- 双缓冲问题
- 闪烁问题
- 小型软件开发
- 记事本
- 图形架构软件
- 提纲图形
- 操作
- 重载关闭按钮
- 自定义消息
- 自绘按钮
- 自绘基础知识
- 自绘按钮提纲
- 步骤
- 自会下拉列表
- 自绘下拉列表
- 自绘菜单栏
- MFC函数类
- SetTimer
- 高级控件应用
- 高级控件开发提纲
- 菜单栏
- 网络通信协议
- 提纲
- sizeof====strlen
- 堆 == 栈
- Socket
- 基本代码
- UDP协议
- Win32
- 窗口操作
- 创建窗口,自定义按钮
- 给按钮加背景图
- 给窗口加背景
- 贴图
- DLL组件创建
- HOOK钩子
- MinGW
- duilib
- 地址
- 属性列表
- 第一个duilib项目
- DUI自带的完整
- ListControl
- TreeView
- 重设窗口大小
- 计算DPI
- HandleMessage跟MessageHandle
- CEF
- cef环境搭建
- cefsimple简单流程
- 优化CEF
- P2P
- stun搭建
- QT5
- QT5环境安装
- QT信号与槽的概念
- QT工程CMakeLists.txt文件的编写
- QT32位
- libShadowQT
- GoflywayQT
- 计划
- Protocol Buffer
- ProtoBuf安装
- 包管理器
- vcpkg
- conan
- xmake
- C++面试总结
- 基础
- 分布式锁
- C++重载、覆盖与多态性
- 20道必须掌握道C++面试题
- 传值、传地址、传引用总结
- 50道面试题 (1)
- 50道面试题 (2)
- 内联函数的作用以及使用限制
- vector的resize用法
- 虚函数/虚表/虚基类
- 公司面试
- 面试:简单算法题目
- 面试:GetMemory
- 2021-3/11号面试记录(lihe)
- leetcode
- leetcode331-验证二叉树的前序序列化
- leetcode141. 环形链表
- C/C++程序员面试秘籍
- 链表
- 使用C/C++实现atoi和itoa函数
- mysql面试题
- 协程解析
- 协程解析一(ucontext解析)
- 协程解析二(云风的coroutine)
- 进程、线程、协程
- 自己制作一个协程库
- C语言中两个指针间的运算
- Windows中一些宏的含义
- C++书籍在线观看
- 安装TeamTalk
- Lua和C/C++互相調用
- android环境配置
- TCP/IP
- 三次握手四次挥手
- 有限状态机
- 游戏开发
- UE4
- 开发一个fps的游戏
- 环境安装,让人物跑起来
- 增加血条和护甲
- 再生盔甲和伤害功能
- 最后一战
- 最后一战安装部署
- 登录流程 LS & BS & CS
- 最后一战-游戏场景服务器SS
- 降临
- 降临安装部署
- skynet
- skynet安装部署
- lua-protobuc库--skynet使用自定义protobuf
- pbc库--skynet使用自定义protobuf
- 扫雷
- 仙剑奇侠传
- 炉石传说
- unity环境搭建
- 寻路算法
- 音视频
- WebRTC
- webrtc源码下载
- webrtc 编译
- gn和ninja文件作用
- webrtc 源码目录结构
- WebRTC实时互动入门
- web 服务
- nodejs 搭建http服务
- nodejs 搭建https服务
- webrtc 获取音视频设备
- webrtc 音视频采集
- webrtc 音视频约束
- webrtc 浏览器视频特效
- webrtc 从视频中获取图片
- webrtc 只采集音频数据
- webrtc MediaStream和获取视频约束
- webrtc 媒体流的录制
- webrtc 捕获桌面
- webrtc 信令服务器
- webrtc 传输基本知识
- webrtc NAT
- webrtc ICE
- webrtc 媒体能力协商
- webrtc 端到端链接的基本流程
- webrtc SDP
- webrtc STUN/TURN
- webrtc 客户端信令消息
- webrtc 视频通话实现
- webrtc 传输速率控制
- webrtc 统计信息
- webrtc IOS
- Kamailio
- webrtc的分析
- Webrtc音视频会议之Mesh/MCU/SFU三种架构
- RTSP / RTP / RTCP协议
- RTMP / RTSP / WebRTC之间的关系
- webrtc源码
- PeerConnection解析
- FFmpeg
- FFmpeg命令行的使用
- ffmpeg命令语法
- FFmpeg设备采集
- FFmpeg生成水印
- FFmpeg画中画和视频多宫格
- FFmpeg定时截图
- FFmpeg基本概念
- FFmpeg基本模块
- ffmpeg 滤镜处理
- ffmpeg流的指定
- FFmpeg相关api
- 基本函数
- 打印音视频信息
- 抽取音视频数据
- 捕捉摄像头并推流
- FFmpeg拉流截图
- vs2017编译错误
- 自定义跨平台FFmpeg播放器
- ffmpeg拉流并且使用qt
- ffmpeg读取摄像头并且推流
- ASS和SRT字幕有何区别
- 解决ffmpeg 在avformat_find_stream_info执行时间太长
- sws_getContext()处理AV_PIX_FMT_NONE 帧格式引起的core dump
- OWT系列
- owt-server
- owt-server 编译运行
- owt-server模块
- owt-client-javascript解析
- owt-client-android
- owt-android编译运行
- owt-client-android系列分析
- owt-conference
- Licode
- licode安装
- licode 系列
- basic example client
- basic example server
- 音视频基础概念
- 视频播放中的码率的概念
- 帧率
- nginx-rtmp 模块搭建与使用
- RTMP分析
- RTMP规范
- RTMP流媒体播放过程
- 一段简单的CMakeLists.txt
- Go
- Go Base
- Go 环境安装
- mod
- Go 流程控制
- interface convert to string/int/float64
- Go mod拉取私有仓库
- VSCode配置go环境
- Go 设置代理
- Viper读取配置文件
- vim打造成go的ide
- Go 交叉编译
- GO 简单功能
- Golang发起http请求
- Go 定时任务
- websocket协议
- Golang的定时器
- JWT认证
- Google Protobuf 请求参数为空的案例
- Go文件下载
- Go 服务热更新方案
- Go 静态服务器
- gocolly的使用
- golang中获取字符串长度的几种方法
- hugo搭建静态博客
- go利用reids实现分布式锁
- Go 代理
- Go 简单http代理
- Go SS代理流程
- Go AES加密和解密的三种模式实现(CBC/ECB/CFB)
- Go 负载均衡
- Go 标准库
- reflect.Type和reflect.Value
- container & list & ring & heap
- Context
- http 请求
- Go base64
- Go struct <=> json
- Go切片合并
- Go 包的使用
- pprof包的使用
- Go Grpc
- ymal 配置文件
- 日志包 logrus / zap
- Go 命令行多指令操作
- Cobra/viper 命令行解析
- Go sync/atomic
- zap日志
- Go 进阶
- Go sync.Mutex详解
- 使用自定义头和protobuf解决沾包问题
- 使用 build tag 来自定义构建配置
- 使用valgrind检测程序是否内存泄露
- Go参数传递是值传递还是引用传递
- Go 切片/数组
- Channel的使用
- Go Interface详解
- GO-IM系统
- IM架构
- Go搭建一个http服务器
- mattermost-server
- matter编译部署
- mattermost配置
- matter详解
- Goim
- Centrifugo
- Tinode
- cgo入门
- GO语言中使用C语言
- reflect.StringHeader和reflect.SliceHeader
- Cgo使用libevent库实现一个定时器
- cgo遍历C结构体数组
- Go和C之间的类型转换
- Elasticsearch
- Elasticsearch安装
- etcd的使用
- etcd 安装
- Docker
- Docker 安装部署
- 修改Docker镜像源
- 使用Dockerfile构建部署项目
- 使用Dockerfile多阶段构建
- Dockerfile指令解析
- Volume
- 创建一个images
- Docker容器管理
- Shipyard
- Portainer
- lazydocker-docker 终端ui管理
- Docker 容器-ssh登录
- Dockerfile CMD启动命令
- Docker 容器独立ip
- 清理 Docker文件
- Docker-Composer
- Docker远程访问
- Docker 远程访问API设置
- Docker 结合IDEA使用
- Docker 使用错误
- Docker镜像瘦身
- Docker查看退出码 exitCode
- Docker安装宝塔
- Docker创建calibre-web
- Docker不能使用gdb调试的解决方案
- k8s
- K8s安装部署
- 安装部署coreDNS
- web管理之一 Dashboard
- dashboard的yaml文件
- 集群监控 heapster
- 资源监控 metrics
- web管理之二 Prometheus
- idea k8s插件
- 第一个 k8s应用
- k8s将pod在master上运行
- k8s网络通信模型
- Deployment和Pod区别
- Statefulset的基本使用
- k8s的持久化存储 PersistentVolume
- Ingress基本用法
- k8s错误处理
- 角色权限
- busybox k8s的调试工具
- nfs的安装和使用
- Kafka
- kafka介绍
- Redis
- Redis的安装
- Redis主从配置
- Redis数据类型
- Redis-Set
- Redis-Hash
- Redis设计与实现
- 第一节:sds
- 第二节:链表的实现
- 第三节:字典的实现(一) - 基本原理
- 第四节:字典的实现(二) - 哈希算法
- 第五节:字典的实现(三) - 哈希冲突解决方案
- 第六节:字典的实现(四) - rehash原理
- 第七节:跳跃表
- 第七节:整数集合
- 第八节:压缩列表
- 第九节:对象
- 总结
- Redis源码分析
- 配置VScode调试Redis源码
- VScode调试Redis源码,指针显示的问题
- Redis模块概述
- Redis的五个数据类型
- sds字符串分析
- adlist分析
- ziplist压缩列表
- quicklist
- dict字典--hashtable
- zskiplist-跳跃表
- sparkline微线图
- Redis源码的一些基础知识总结
- 在redis中遇见redisObject struct
- acl库编写Redis客户端
- hireids操作
- 当内存耗尽时,redis怎么做
- 如何保证redis的高并发及高可用?
- 使用redis实现分布式锁
- Redis管道技术测试
- MongoDB
- MongoDB安装
- MongoDB免安装版
- Mongodb C Driver驱动安装
- MongoDB知识点
- MongoDB基础
- MongodB原子操作
- MongoDB索引
- MongoDB主从/副本集
- MongoDB分片集群
- MongoDB性能检测
- MongoDB构建模式
- Mongo-cxx-driver
- mongo-c-driver
- MongoDB用户操作
- MySQL
- MySQL安装
- 一个机器多个MySQL
- 创建远程链接
- 字段编辑
- 存储过程
- MySQL严格模式
- Mysql 丢失Root密码
- 中国全省市表
- 高性能MySQL
- MySQL并发控制
- MySQL基准测试
- MySQL服务器性能剖析
- MySQLSchema与数据类型优化
- MySQL创建高性能索引
- MySQL复制
- MySQL-高可用
- MySQL引擎
- DB
- Oracle
- ORACLE9i安装
- Oracle存储过程
- Oracle 存储过程基础组件
- Oracle存储过程示例
- Other Language
- Python
- python编程通用概念
- python安装
- pycharm-docker调试
- Python安装AES加密
- python安装pip
- 错误
- py框架
- Django
- 开始一个项目
- 路由
- 模型层
- 创建博客文章模型
- Django Shell
- 初识Django Admin模块
- 实现博客数据返回页面
- 初始Django视图与模板
- boot静态页面
- django分页
- Django设置
- djangocms
- 语言特性
- 切片
- PHP
- php外部扩展
- 添加C扩展
- 添加外部C扩展
- 添加redis
- redis
- 下载
- 封装
- 外部访问配置
- redis基本操作
- 框架
- TP5
- Model
- 自动写入时间戳
- Laravel
- 安装
- TP3.2
- CACHE缓存
- create
- curl
- 文件下载
- 模块名字
- 常用工具
- 功能代码
- 检测磁盘剩余空间
- 静态类
- 消除html标签
- 检测手机号
- 毫秒 == 日期格式
- jQuery
- 找子元素
- php网络编程
- socket
- socket_server.php
- socket_client.php
- websocket
- websocket_server.php
- websocket_client.html
- websocket_unit.js
- swoole
- 环境依赖及安装
- 搭环境
- windows搭建apache+php7
- nginx做成服务顺便配置php
- Lua
- Lua环境安装
- lua api
- lua_pop & lua_settop
- lua_next
- JAVA
- Java通用编程概念
- Java环境安装
- 编译遇到的问题
- 请求接口
- java变量类型
- Android
- IDEA 配置 gradle
- Rust
- Rust编程通用概念
- Rust安装
- 更换crates源
- 写一个hello world
- 变量可变性
- 数据类型
- Struct+方法语法
- 赋值
- tokio网络框架
- tokio安装
- EchoServer
- 实现Future
- 组合器
- shadowsocket-rust
- shadowsocket-rust安装
- Scheme
- 环境搭建及基本语法
- JavaScript
- NodeJs
- React
- React-Native
- 使用pkg打包
- Nginx
- Nginx-反向代理
- OpenResty初探
- OpenResty做一个postman
- lua没有continue
- nginx 配置静态服务器
- 将luarocks整合进openresty,并安装lfs
- Git
- GitHub基本操作
- Github跟本地的配置和操作
- GitHub搜索
- Github镜像
- git修改远程仓库
- Git基本操作
- 安装gitlab
- VC工程的.gitignore
- Git 设置代理
- Git克隆部分文件
- Linux
- 用户操作
- 防火墙操作
- 压缩
- Linux时间同步
- CURL
- Linux samba文件共享
- 使用cat创建新文件并追加内容
- htop / glances / dstat
- IPC错误
- nc的使用
- 核与线程 CPU 4核8线程 的解释
- Linux 使用 MLDonkey 下载 ed2k
- Linux技巧
- LINUX技巧-查找文件行中值重复的行
- tcpdump 抓包
- 日志查找
- nethogs 查看网络流量
- 系统中加入库目录
- 将root权限的文件改为用户权限
- linux 打开文件数 too many open files 解决方法
- 查看系统CPU/GPU/磁盘io
- 快速删除大量文件的方法
- Linux-文件传输
- 安装 nvidia 驱动
- 改造VIM
- 通过vimplus项目一键配置vim
- 自定义vim配置C++IDE
- 终端配色
- VIM+项目管理
- vimplus快捷键
- 自动切换输入法
- Shell编程
- shell脚本守护进程
- if [ $# -eq 0 ]该语句是什么含义?
- 从命令行提示输入,和自动输入,自动交互
- grep指令
- cut指令
- awk指令
- xargs
- 使用except自动交互
- Ubuntu
- 界面安装
- 更换源
- Ubuntu安装docker
- Ubuntu18 安装qt
- 更新密钥
- Ubuntu开启远程登录
- Ubuntu16.04界面无法启动
- apt-get install 没有自动安装
- dpkg: 处理软件包 nginx (--configure)时出错
- ubuntu下浏览器使用代理
- Ubuntu把放大缩小按钮移动到左边
- wine 安装错误
- Ubuntu下安装Microsoft to do
- 在Ubuntu上使用ssh连接另外一台机器出问题
- 解决windows和ubuntu16.04虚拟机拖放问题
- 解决apt-get /var/lib/dpkg/lock-frontend 问题
- Ubuntu安装cinnamon
- sudo apt-get update错误
- googlechrome
- Ubuntu16.04安装xmind
- Ubuntu下载迅雷
- Linux护眼宝
- 查看Ubuntu安装的界面
- 使用aria2
- CentOS7使用yum安装gcc
- System
- MAC
- 安装软件
- mac基本操作
- 安装pod
- 改造终端
- VIM配置
- Chroom浏览器https访问
- mac摄像头打不开
- Mac与Windows或Linux的键鼠共享神器Synergy
- Windows
- 小工具
- bat文件的使用
- bat把exe文件做成单击右键可运行的
- copy
- 注册 dll
- 镜像==分区
- choco
- BaiduPCS-go
- tail日志查看命令
- 右键菜单没有选项
- Proxy SwitchyOmega
- Google云服务器配置
- 百度网盘不限速
- 远程桌面
- 百度地图离线开发
- 查看端口
- SC命令使用
- 开发
- TIME_WAIT过多导致服务不能被访问
- 修改win的默认编码
- 百度网盘二维码刷新不出来
- 移动端
- Object-C
- 录音跟播放
- 视频的采集跟播放
- Swift
- Swift编程通用概念
- Switf环境安装
- Swift Package Manager(SPM)
- 手动导入库
- PerfectTemplate的使用
- PerfectTemplate环境搭建
- ios直播开发
- Simple-RTMP-Server
- Mac上安装ffmpeg环境
- 推流拉流
- 仿直播app开发
- 框架搭建
- 开发流程
- React-Native
- React-native环境安装
- 分布式追踪系统
- Jaeger 客户端库
- LightStep 的使用
- 软件
- PhpStorm
- 安装ThinkStrom
- 添加xdebug
- Clion
- C++开发配置
- 激活码
- 在linux上制作桌面图标
- Vagrant
- VMWare
- VirtualBox
- proxifier + Shadowshocks
- Cmder
- Navicate For MongoDB
- MinDoc
- GitHub速度慢
- 科学
- VMware虚拟机磁盘操作占用过高问题
- PhotoShop+Premiere下载
- ActionView安装部署
- 读书笔记
- 博客
- hexo
- 部署
- jekyll
- 在线编译器
- 书屋
- 如何阅读一本书
- 个人发展
- Linux高性能服务器读书笔记
- TCP/IP协议族
- IP协议
- TCP协议详解
- TCP协议的拥塞控制
- 安全测试
- 常见web安全漏洞
- 程序设计
- log日志设计
- 爬虫项目
- Python3.7的安装
- Scrapy的安装和使用
- Colly框架
- Crawlab是一款款里爬虫的web框架
- 英文学习