![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
基础
青石玄霄
吾生也有涯,而知也无涯
展开
-
线程间通信
全局变量通过全局变量进行通信,要对该变量加关键字volatilevolatile(易变的):每次从内存中去读这个值,而不是因编译器优化从缓存的地方读取#include <stdio.h>#include <windows.h> //全局变量volatile int signalNum = 0; DWORD WINAPI threadFuncA(LPVOID lpParamter){ Sleep(2000); if (0 == signalNum) {原创 2021-06-07 23:04:44 · 86 阅读 · 0 评论 -
IOCP
步骤1、创建完成端口2、创建用于接发数据的工作线程3、创建套接字,侦听套接字,accept返回的套接字与iocp绑定// iocpserver.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//#include <WinSock2.h>#include <Windows.h>#include <vector>#include <iostream>using namespace std;#pr.原创 2021-06-07 22:04:23 · 330 阅读 · 0 评论 -
友元函数
友元包括友元函数和友元类◼ 如果将函数A(非成员函数)声明为类C的友元函数,那么函数A就能直接访问类C对象的所有成员◼ 如果将类A声明为类C的友元类,那么类A的所有成员函数都能直接访问类C对象的所有成员◼ 友元破坏了面向对象的封装性,但在某些频繁访问成员变量的地方可以提高性能class Point { friend Point add(Point, Point);private: int m_x; int m_y;public: int getX() { return m_x;...原创 2021-04-12 22:45:47 · 107 阅读 · 0 评论 -
运算符重载
运算符重载(操作符重载):可以为运算符增加一些新的功能class Point {public: int m_x; int m_y; Point(int x, int y) :m_x(x), m_y(y) {} void display() { cout << "(" << m_x << ", " << m_y << ")" << endl; } Point(const Point &point) {原创 2021-05-27 22:40:51 · 132 阅读 · 0 评论 -
模板
泛型,是一种将类型参数化以达到代码复用的技术,C++中使用模板来实现泛型模板的使用格式如下template <typename\class T>typename和class是等价的模板没有被使用时,是不会被实例化出来的模板的声明和实现如果分离到.h和.cpp中,会导致链接错误一般将模板的声明和实现统一放到一个.hpp文件中...原创 2021-05-26 23:58:40 · 80 阅读 · 0 评论 -
智能指针
传统指针存在的问题需要手动管理内存,容易发生内存泄露(忘记释放、出现异常等),释放之后产生野指针智能指针的简单实现原创 2021-05-26 23:05:44 · 73 阅读 · 0 评论 -
C++类型转换
四种cast转换C++中四种类型转换是:static_cast, dynamic_cast, const_cast, reinterpret_caststaic_cast常用于基本数据类型的转换、非const转成const,对比dynamic_cast,缺乏运行时安全检测,不能交叉转换(不是同一继承体系的,无法转换)const_cast一般用于去除const属性,将const转换成非constconst Person *p1 = new Person();Person *p2 =原创 2021-05-26 22:51:57 · 79 阅读 · 0 评论 -
基础随机笔记
strlen(str)求字符串的长度,遇到\0是结束计算,不算 \0,但是sizeof算\0const char s2[] = "12345";cout << sizeof(s2) << endl; //算结束符 6cout << strlen(s2) << endl; //不算结束符,所以是5...原创 2021-05-25 23:53:50 · 64 阅读 · 0 评论 -
内联函数和宏
使用inline修饰函数的声明或者实现,可以使其变成内联函数建议声明和实现都增加inline修饰特点编译器会将函数调用直接展开为函数体代码可以减少函数调用的开销会增大代码体积注意尽量不要内联超过10行代码的函数有些函数即使声明为inline,也不一定会被编译器内联,比如递归函数◼ 内联函数和宏,都可以减少函数调用的开销◼ 对比宏,内联函数多了语法检测和函数特性inline int sum(int x) { return x + x; }#define..原创 2021-05-25 22:50:59 · 121 阅读 · 0 评论 -
go协程
Go 主线程(有程序员直接称为线程/也可以理解成进程): 一个 Go 线程上,可以起多个协程,你可以这样理解,协程是轻量级的线程[编译器做优化]。Go 协程的特点有独立的栈空间 共享程序堆空间 调度由用户控制 协程是轻量级的线程...原创 2020-06-14 20:50:19 · 220 阅读 · 0 评论 -
进程和线程
进程就是程序在操作系统中的一次执行过程,是系统进行资源分配和调度的基本单位 线程是进程的一个执行实例,是程序执行的最小单元,他是比进程更小的能独立运行的基本单位 一个进程可以创建和销毁多个线程,同一个进程中的多个线程可以并发执行 一个程序至少有一个进程,一个进程至少有一个线程...原创 2020-06-14 19:59:58 · 85 阅读 · 0 评论 -
json序列化及反序列化
package mainimport ( "fmt" "encoding/json")//定义一个结构体type Monster struct { Name string `json:"monster_name"` //反射机制 Age int `json:"monster_age"` Birthday string //.... Sal float64 Skill string}func testStruct() { //演示 monster := Monster{.原创 2020-06-14 15:33:19 · 159 阅读 · 0 评论 -
二维数组
二维数组的本质就是一维数组,数组里面的元素是一维数组,内存布局如下图arr2可以看成一个一维数组,里面有两个元素,分别存放的是另外一个一维数组的地址原创 2020-06-06 23:06:30 · 94 阅读 · 0 评论 -
for range
原创 2020-06-03 23:22:55 · 138 阅读 · 0 评论 -
补码
package mainimport( "fmt")func main(){ //位运算 fmt.Println(2&3) //2 fmt.Println(2|3) //3 fmt.Println(2^3) //3 fmt.Println(-2^2) //-4}右移运算符 >>: 低位溢出, 符号位不变, 并用符号位补溢出的高位左移运算符 <<: 符号位不变, 低位补 ...原创 2020-06-02 22:46:52 · 139 阅读 · 0 评论 -
闭包
闭包含义原创 2020-06-02 22:30:36 · 145 阅读 · 0 评论 -
递归
使用递归的方式,求出斐波那契数 1,1,2,3,5,8,13......给你一个整数n,求出它的斐波那契数是多少?思路:当n==1 || n==2,返回1 当n>=2,返回前面两个数的和f(n-1)+f(n-2)代码:func fbn(n int) int{ if(n == 1 || n == 2){ return 1 }else{ return fbn(n - 1) + fbn(n - 2) }}...原创 2020-05-31 22:26:29 · 406 阅读 · 0 评论 -
进制转换
进制原创 2020-06-02 22:35:57 · 69 阅读 · 0 评论 -
TCP/IP笔记
Seq Number含义在TCP中,数据不是按包排序的,而是按字节排。每个包的seq number代表的是发送字节的起始序号。发送的第一包的初始是随机的,在创建连接的三次握手过程中交换Ack Number含义在TCP中,Ack Number代表的是希望对方发送数据的起始位置。例如,a向b发送了一个数据包,其seq number为1000,其大小为1000字节,则b收到该包后,返回的Ack Number为2001....原创 2020-05-25 23:14:00 · 79 阅读 · 0 评论