C/C++开发之路
文章平均质量分 58
码农code之路
一入码海深似海,从此天涯是路人
展开
-
socket的send和recv的超时设置
二、send的超时不会体现在对send函数的调用上,看msdn的解释:If no buffer space is available within the transport system to hold the data to be transmitted, send will block unless the socket has been placed in nonblocking mode.即只要协议栈缓冲区窗口没满,send就会成功。一、socket必须是阻塞类型的,否则设置超时毫无意义。原创 2023-02-25 18:20:56 · 2265 阅读 · 0 评论 -
【C++札记】内联函数
概述函数的使用使得相同代码不必多次重写,但会带来额外的开销,函数调用的过程中会有入栈和出栈,这些都会消耗时间。如果一个函数在程序运行过程中被成千上万次调用,那么这个开销也是不容忽视的,C++中引入了内联函数,直接在函数前面加上inline,在编译过程中直接把函数代码内嵌,避免了运行过程中的函数调用,但会增加程序代码段的空间。可以任务以空间来换取时间。示例:inline in...原创 2019-06-15 15:13:54 · 265 阅读 · 0 评论 -
【底层原理】高级开发必须懂的"字节对齐"
认识字节对齐之前,假定int(4Byte),char(1Byte),short(2Byte)认识字节对齐先看段代码:structData1{chara;intb;shortc;};structData2{inta;charb;shortc;};intmain(){cout<<sizeof(Data1) <<...原创 2019-05-27 17:06:24 · 366 阅读 · 0 评论 -
一次邮件发送协议SMTP问题排查
项目中需要用到smtp协议来发送邮件告警,后端的技术栈主要是Java和C++,Java项目里直接在网上找的现成的类完美实现,163邮箱,腾讯邮箱和阿里邮箱均测试通过,不幸的是C++的项目也需要使用smtp协议来发送邮件,惯例先度娘,CSDN逛了一圈,例程也不少但是每个下边留言都有这样和那样的问题,copy过来直接运行,163邮箱完美测试通过,我们用的钉钉全家桶,测试钉钉邮箱时发现不能发送邮件,认证...原创 2019-04-08 09:24:28 · 3983 阅读 · 0 评论 -
C++11并发编程:多线程std::thread
一:概述C++11引入了thread类,大大降低了多线程使用的复杂度,原先使用多线程只能用系统的API,无法解决跨平台问题,一套代码平台移植,对应多线程代码也必须要修改。现在在C++11中只需使用语言层面的thread可以解决这个问题。所需头文件<thread>二:构造函数1.默认构造函数thread() noexcept一个空的std::thread执行对象...原创 2018-12-20 15:27:30 · 559 阅读 · 0 评论 -
C++11并发编程:原子操作atomic
一:概述 项目中经常用遇到多线程操作共享数据问题,常用的处理方式是对共享数据进行加锁,如果多线程操作共享变量也同样采用这种方式。 为什么要对共享变量加锁或使用原子操作?如两个线程操作同一变量过程中,一个线程执行过程中可能被内核临时挂起,这就是线程切换,当内核再次切换到该线程时,之前的数据可能已被修改,不能保证原子操作。 C++11提供了个原子的类和方法atomic,保证了多线程对...原创 2018-12-14 15:32:04 · 4624 阅读 · 1 评论 -
【设计模式】单例模式,嵌套类实现释放对象内存
一.概述 单例模式就是一个类只能被实例化一次 ,也就是只能有一个实例化的对象的类。减少每次都new对象的开销,节省系统资源,同时也保证了访问对象的唯一实例。常用于如下场景:1.频繁实例化然后销毁的对象。2.创建对象太耗时,消耗太多资源,但又经常用到。二.代码实现C++11代码实现,/******************************************...原创 2018-12-06 11:02:33 · 953 阅读 · 0 评论 -
纯C++实现操作配置文件(告别跨平台问题)
CConfig.h#ifndef _CCONFIG_H#define _CCONFIG_H#include <iostream>#include <string>#include <fstream>#include <vector>using namespace std;class CConfig{public: CCo...原创 2018-11-16 12:00:21 · 983 阅读 · 0 评论 -
线程同步(windows平台):临界区
一:介绍 临界区指的是一个访问共用资源(例:全局变量)的程序片段,该共用资源无法同时被多个线程访问的特性。有多个线程试图同时访问临界区,那么在有一个线程进入后其他所有试图访问此临界区的线程将被挂起,并一直持续到进入临界区的线程离开。临界区在被释放后,其他线程可以继续抢占,并以此达到用原子方式操作共享资源的目的。 临界区在使用时以CRITICAL_SECTION结构对象保护共享...原创 2018-10-23 16:42:20 · 1810 阅读 · 0 评论 -
线程同步(windows平台):互斥对象
一:介绍互斥对象是系统内核维护的一种数据结构,保证了对象对单个线程的访问权。二:函数说明创建互斥对象: HANDLE CreateMutex( LPSECURITY_ATTRIBUTES lpMutexAttributes, 安全属性结构指针,可为NULL,表示默认安全性 BOOL bInitialOwner, //是否占...原创 2018-10-23 18:33:25 · 1857 阅读 · 0 评论 -
线程同步(windows平台):事件
一:介绍事件Event实际上是个内核对象,事件分两种状态:激发状态和未激发状态。分两种类型:手动处置事件和自动处置事件。手动处置事件被设置为激发状态后,会唤醒所有等待的线程,一直保持为激发状态,直到把它设置为未激发状态。自动处置事件被设置为激发状态后,会唤醒一个等待中的线程,然后会自动设置成未激发状态。二:函数说明创建事件对象: HANDLE CreateEvent ...原创 2018-10-24 11:51:18 · 1953 阅读 · 0 评论 -
线程同步(windows平台):信号量
一:介绍信号量也是系统核心对象,它允许多个线程同一时刻访问同一资源,但需限制同一时刻访问资源的最大线程数目。信号量遵循规则:1.当前资源计数大于0,信号量有效。2.当前资源计数等于0,信号量无效。3.系统不允许当前资源数量为负。4.当前资源数量不能大于最大资源数量。二:函数说明创建信号量: HANDLE CreateSemaphore( LPS...原创 2018-10-24 16:51:32 · 2040 阅读 · 0 评论 -
基于libcurl实现REST风格http/https的get和post
c/c++开发中经常要用到http/https协议,直接使用socket工作量很大,要是使用socket实现https,那更不可思议,开源的c/c++的http客户端框架,libcurl是首选,而且也相当成熟稳定,最近C++项目中用到https请求,就做下研究。libcurl简介(来源官网)libcurl是一个跨平台的网络协议库,支持http, https, ftp, gopher, te...原创 2018-10-16 15:01:25 · 3917 阅读 · 0 评论 -
【C++札记】标准输入与输出
概述C语言中使用函数scanf和printf作为标准输入和输出,在C++中引入了类cin和cout进行标准输入和输出,所需头文件为<iostream>,命名空间是std。这里所说的标准输入和输出是相对程序而言,输入是通过IO设备,如键盘输入到程序,输出是指输出到IO设备,如程序输出到屏幕。标准输入cin是标准输入流对象,是istream类的对象。cin是从缓冲区读取数...原创 2019-06-14 15:27:10 · 2061 阅读 · 0 评论 -
【C++札记】函数重载
概述函数重载指在相同作用域中多个函数名相同,函数的形参不同。遵循规则:1.函数名相同2.函数的参数,类型,个数或顺序不一样都可以构成重载。3.函数返回值得类型不同不构成重载,编译直接报错,存在二义性(ambiiguous)#include <iostream>using namespace std;void foo(int a){ co...原创 2019-06-15 14:25:37 · 264 阅读 · 0 评论 -
面试官:一道二级指针函数传递分析运行后结果
今天看到一道有趣的题记录下:int i=0,j=20,*p1=&i,*p2=&j;void f(int** ptr1, int* ptr2){ int *tmp = ptr2; **ptr1 *= 10; *ptr2 *= 10; ptr2 = *ptr1; *ptr1 = tmp;}//请问调用f(&p1, p2)之后i,j,p1,p...原创 2019-07-21 21:45:30 · 183 阅读 · 0 评论 -
【C++札记】指针数组和数组指针
指针数组:存储指针的数组,数组找那个的每个一元素都是指针例:int* p1[4],p2[0]是一个指向int类型的指针char* p2[4],p1[0]是一个指向char类型的指针数组指针:指向数组的指针例:int (*p)[4]这里需要注意下int a[3] = {1, 2, 3);int (*p)[3] = a; //错误,a为数组元素...原创 2019-07-24 15:44:15 · 361 阅读 · 0 评论 -
基于Snappy实现数据压缩和解压
Snappy是谷歌开源的一个用来压缩和解压的开发包。相较其他压缩算法速率有明显的优势,官方文档显示在64位 i7处理器上,每秒可达200~500MB的压缩速度,不禁感叹大厂的算法就是厉害。开源项目地址:https://github.com/google/snappy开撸:1.下载最新版本Snappy 1.1.7,下载地址如下:https://github.com/goo...原创 2019-07-12 16:38:35 · 10819 阅读 · 4 评论 -
【C++札记】多态
C++中多态是面向对象设计思想的重要特性,同名具有不同功能函数,该函数调用过程执行不同的功能。多态的原理是通过一张虚函数表(Virtual Table)实现的。动多态会牺牲一些空间和效率来最终实现动态绑定。静多态函数重载为静多态,绑定发生在编译期间,根据函数的参数来确定调用哪个函数。#include <iostream>using namespace ...原创 2019-06-30 14:20:26 · 201 阅读 · 0 评论 -
【C++札记】虚继承
由于多重继承产生的二义性引入了类的虚继承,先看下什么是二义性。类D是类B和类C的派生类,而类B,类C就是继承于类A,当D调用类A中的函数时不知道是类B继承A的,还是类C继承A的,引起了二义性。虚继承可以解决这个问题。使用语法:class 派生类:virtual 继承方式 虚基类{};上图中类D实例化过程中的初始化顺序:祖父类(A)--->父类(从左到又)---...原创 2019-06-23 14:42:51 · 217 阅读 · 0 评论 -
【C++札记】类的继承
继承面向对象的设计思想,类对数据做了封装,并可以加入访问权限,类的继承是面向对象思想的精髓。类的继承可以让新类从以有的类中获得已有的特征。原有类称为基类或父类,新类称为派生类或子类。语法:class 子类类名:[继承方式] 父类类名{} ;继承的方式有三种:1.共有继承:(使用最广泛)在派生类中原来的公有成员,保护成员身份不变。原私有成员仍不可访问。2.私有...原创 2019-06-23 13:32:51 · 270 阅读 · 0 评论 -
【C++札记】友元
C++封装的类增加了对类中数据成员的访问限制,从而保证了安全性。如想访问类中的私有成员需要通过类中提供的公共接口来访问,这样间接的访问方式,无疑使得程序的运行效率有所降低。友元的提出可以使得类外的函数来访问类中的私有成员,保护成员。友元的使用分为三类:1.类外的普通函数声明为该类的友元函数。格式: friend 类型 函数名(形参)2.其他类的成员函数声明为该类的友元函数。...原创 2019-06-22 18:54:33 · 192 阅读 · 0 评论 -
【C++札记】实现C++的string类
C++有了string类使得操作字符串变得很方便。有关string类,面试过程中也经常问到的就是自己实现一个sring类。下边实现个String类供大家参考:String.h#pragma onceclass String{public: //构造函数 String(const char* str = nullptr); //拷贝构造函数 String(const St...原创 2019-06-18 15:34:12 · 193 阅读 · 0 评论 -
【C++札记】拷贝构造函数,浅拷贝和深拷贝
一:拷贝构造函数拷贝构造函数是一种特殊的构造函数,遵循如下的规则:1.函数名和类名一致,没有返回值。2.必须有一个参数,参数是本类型的一个引用变量。3.拷贝构造函数可以访问参数对象的任意成员(private也可以)。4.若自己不提供拷贝构造函数,系统会提供默认构造函数,若自己定义,系统将不再提供。5.系统提供的拷贝构造是浅拷贝。书写示例如下:class Stude...原创 2019-06-18 11:21:22 · 351 阅读 · 0 评论 -
【C++札记】赋值兼容
赋值兼容的规则时在需要使用基类对象的任何地方都可以使用公有派生类对象来替代。公有继承派生类可获得基类中除构造函数,析构函数外的所有成员,能用基类解决的问题,派生类也能解决。更直白点说,如果一个类是从一个基类公有继承过来,那么这个派生类就可以替代基类,反过来基类不能替代派生类。常用赋值兼容情况:1.派生类对象赋值给基类对象。2.派生类对象初始化基类对象引用。3.派生类对象地址赋...原创 2019-06-25 16:41:15 · 380 阅读 · 0 评论 -
【C++札记】const关键字
C++中const关键字无处不在,我这里做下汇总,作为工具文章方便翻阅。一:修饰数据成员修饰的成员一单定义初始化后不能再进行修改,如:const int a = 10;a =20; //重新赋值直接会报错当修饰类的成员函数时,先来段错误的代码class Student{public: Student(int i) { thi...原创 2019-06-21 15:41:31 · 224 阅读 · 0 评论 -
C++操作文件行(读取,删除,修改指定行)
/********************************************************Copyright (C), 2016-2018,FileName: mainAuthor: woniu201Email: [email protected]: 2018/08/31Descri...原创 2018-08-31 15:56:16 · 41010 阅读 · 7 评论 -
【C++札记】指针函数与函数指针
指针函数指针函数是一个函数,只不过指针函数返回的类型是某一类型的指针。格式:类型名*函数名(函数参数列表)如下代码存在问题void test(char *p){ p = (char*)malloc(10); return;}int main(){ char* p1 = NULL; test(p1); return 1;}test函数执行完后...原创 2017-11-22 10:41:48 · 2454 阅读 · 0 评论 -
C++:内部类
介绍1.把一个类定义在另一个类的内部,称里面的类为内部类。 例如:class A{public: class B { public: int x; int y; };};类B即为内部类。 2.内部类和外部类相互没有特权,即外部类无法自由访问内部类,内部类也无法自由访问外部类。 a.他们不是朋友关系。 b.他们不是父子关系...原创 2017-07-17 16:58:01 · 10227 阅读 · 0 评论 -
【C++札记】new和delete
介绍1.malloc,free和new,delete区别。 a.malloc,free是C/C++的标准库函数。new,delete是c++的操作符。 b.malloc申请的是内存,严格意义不是“对象”,new申请的可以理解为“对象”,new 时会调用构造函数,返回指向该对象的指针。 c.对于class类型,必须用new/delete来创建和销毁,自动调用构造和析构函数...原创 2017-07-17 14:24:32 · 8368 阅读 · 0 评论 -
【C++札记】构造函数与析构函数
构造函数(constructor)1.构造函数是种特殊的类成员函数,遵循如下规则: a.函数名与类名必须相同。 b.没有返回值例如:class Obj{...public: Obj() { ... }};2.构造函数可以带参数,也可以重载class Obj{...publ...原创 2017-07-16 14:59:48 · 8193 阅读 · 0 评论 -
【C++札记】类的分离式写法
介绍类的分离式写法,使得代码更加规范,增强了阅读性。分离式写法的规则:1.类的变量:写在类的里面2.成员函数:类中写函数的声明,函数的定义写在类体外。3.写在类外函数定义时,类名前加限定(Object: :),其中, ::理解为表示范围的符号。代码演示头文件:Object.h#ifndef _OBJECT_H_#define _OBJECT_H_clas...原创 2017-07-16 11:43:16 · 6708 阅读 · 0 评论 -
【C++札记】动态分配内存(malloc,free)
介绍操作系统中存在一个内存管理器(Memory Manager),简称MM,它负责管理内存。MM提供的服务:应用程序可以向MM申请一块指定大小的内存(借出),用完之后应用程序应该释放(还回)。所需头文件 <stdlib.h>如:void* p = malloc(1024);//申请,从MMM借出内存free(p); //释放,还回MM1.MM管理的内存...原创 2017-07-16 11:08:42 · 10170 阅读 · 2 评论 -
C++:标准C函数(随机数,时间函数)
介绍ANSI组织定义了C标准和标准库函数。使用标准C函数优点:使用标准C函数在任何平台上都支持,使得同一个源码,在Windows编译运行的结果和Linux上编译运行结果相同,无需更改代码。 随机数(rand)产生指定范围内随机数(1~100) #include <stdio.h>#include <stdlib.h>int main(...原创 2017-07-15 21:46:12 · 10077 阅读 · 0 评论 -
【C++札记】引用
介绍引用是C++中特有的语法,在C语言中不存在。本质上引用(reference)就是指针,在类型名后面加上一个&号就是引用类型。1.指针与引用的定义进行比较指针定义: 引用定义:int a = 123; ...原创 2017-07-15 20:28:15 · 6969 阅读 · 0 评论 -
C++:链表(有头链表)
介绍把链表分为无头链表和有头链表。无头链表:所有的节点都包含了有效数据,上一篇文章中演示代码使用的就是无头链表。有头链表:用一个固定的头节点来指代整个链表,所有的对象都挂在这个头节点下面,而头节点不包含有效数据。有头链表优点:可以简化链表操作,当链表的对象个数为0时,无头链表不好表示。演示代码创建有头链表,封装函数,通过有头链表的链表头添加节点对象 #in...原创 2017-07-15 17:58:11 · 9938 阅读 · 0 评论 -
C++:链表(初识链表)
介绍链表是把若干个对象用指针串联起来,形成一个链状的数据结构,链表在开发中很重要。1.链表特征:只需要知道一个链表头,就能访问每个节点的对象。2.链表遍历:通过每个节点指针next来对的下一个节点的地址。3.链表尾部:最后一个节点对象的next的值是NULL。 代码演示创建和遍历链表 #include <stdio.h>//结...原创 2017-07-15 17:21:44 · 9525 阅读 · 0 评论 -
C++:标准模板库map
一:介绍map是STL的关联式容器,以key-value的形式存储,以红黑树(平衡二叉查找树)作为底层数据结构,对数据有自动排序的功能。命名空间为std,所属头文件<map> 注意:不是<map.h> 二:常用操作容量:a.map中实际数据的数据:map.size()b.map中最大数据的数量:map.max_size()c.判断容器是否为空:ma...原创 2017-07-24 14:23:18 · 7738 阅读 · 0 评论 -
【C++札记】标准模板库string
介绍c++中字符串string对象属于一个类,内置了很多实用的成员函数,操作简单,方便更直观。命名空间为std,所属头文件<string> 注意:不是<string.h>。跟进代码会发现string其实只是basic_string模板类的一个typedef。赋值 //方法1 string str1 = "woniu201"; //方法2 c...原创 2017-07-26 17:19:36 · 8098 阅读 · 0 评论 -
C++:函数模板
介绍函数模板是用来创建通用的函数,用来支持不同的参数和返回值类型。语法如下: template <typename 数据类型标识符>返回类型 函数名 (参数){ 函数体} 使用函数模板的优点:相同的算法不用重复的写多遍,简化代码。函数模板用于实现通用的算法 generic algrithm,有得成为泛型算法。推荐书写风格: tem...原创 2017-07-18 11:17:41 · 6995 阅读 · 0 评论