编程时整理的资料
灰子学技术
10年+后端开发工程师,8.5年+C++开发,2年Go开发经验。
公众号: 灰子学技术
架构知识文章 25篇+:
Go语言文章40篇+:
算法篇40篇+:
展开
-
TCP/IP协议之四次挥手的过程及原因
四次挥手都做什么?TCP的连接是全双工的,所以连接的拆除需要单独将两个通道分别拆除,而四次挥手所做的事情就是拆除两条通道和释放资源。TCP 提供了连接的一端结束他的发送后,还能接收来自另一端数据的能力,也就是所谓的半关闭。TCP/IP详解卷I这里以Client作为主动发起端,Server作为被动关闭端。第一步,Client主动发起一个Req给Server,里面包含FI...原创 2019-09-22 12:59:52 · 4680 阅读 · 0 评论 -
不要轻视拷贝构造函数与赋值函数
来自:高质量c++编程指南 由于并非所有的对象都会使用拷贝构造函数和赋值操作符,程序员可能对这两个函数有些轻视。请先记住以下的警告,在阅读正文时就会多心: 本章开头讲过,如果不主动编写拷贝构造函数和赋值函数,编译器将以“位拷贝”的方式自动生成缺省的函数。倘若类中含有指针变量,那么这两个缺省的函数就隐含了错误。以类String的两个对象a,b为例,假设a.m_data的内容为“hello”原创 2010-02-05 14:26:00 · 634 阅读 · 0 评论 -
内存的三种分配方式
来自:高质量c++变成指南(1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。(2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。(3) 从堆上分配原创 2010-02-04 12:21:00 · 788 阅读 · 0 评论 -
构造函数析构函数的起源
中所有的语法问题,这的确帮了程序员的大忙。但是程序通过了编译检查并不表示错误已经不存在了,在“错误”的大家庭里,“语法错误”的地位只能算是小弟弟。级别高的错误通常隐藏得很深,就象狡猾的罪犯,想逮住他可不容易。 根据经验,不少难以察觉的程序错误是由于变量没有被正确初始化或清除造成的,而初始化和清除工作很容易被人遗忘。Stroustrup在设计C++语言时充分考虑了这个问题并很好地予以原创 2010-02-04 12:20:00 · 615 阅读 · 0 评论 -
Typedef相关概念
C语言支持一种叫做typedef的机制,它允许你为各种数据类型定义新的名字。typedef声明的写法和普通的声明基本相同,只是让typedef这个关键字出现在声明的前面。例如,下面这个声明:char *ptr_to_char;把变量ptr_to_char声明为一个指向字符的指针。但是,在添加了关键字typedef后,声明变为:typedef char *ptr_to_char;这个原创 2010-02-03 20:20:00 · 703 阅读 · 0 评论 -
断言 assert(表达式) 相关概念
来自:c和指针.P342断言就是声明某种东西应该为真。ANSI C 实现了一个assert宏,它在调试程序时很有用。它的原型如下所示:void assert( int expression ); 当它被执行时,这个宏对表达式参数进行测试。如果它的值为假,它就向标准错误打印一条诊断信息并终止程序。这条信息的格式是由编译器定义的,但它将包含这个表达式所在的源文件的名字以及断言所在的原创 2010-02-03 20:19:00 · 1672 阅读 · 0 评论 -
连接字符串的函数
strcat(连接两字符串) char *strcat (char *dest, const char *src );strcat()会将参数src字符串拷贝到参数dest所指的字符串尾。第一个参数dest要有足够的空间来容纳要拷贝的字符串。该函数返回参数dest的字符串起始地址(strcat函数要求dest参数原先已经包含了一个字符串,该字符串可以是空字符串。它找到这个字符串的末尾,并原创 2010-02-03 20:17:00 · 30804 阅读 · 0 评论 -
array_name和&array_name的异同
前者是指向数组中第一个元素的指针,后者是指向整个数组的指针。char a[MAX]; /*array of MAX characters*/char *p = a; /*p为指向数组的指针*/ char *pa = &a; /*该语句是不正确的,pa的类型为char *,而&a的类型为char (*)[MAX]’*/char (*pb)[MAX] =原创 2010-02-03 19:59:00 · 1012 阅读 · 0 评论 -
不能被重载的运算符
在C++运算符集合中,有一些运算符是不允许被重载的。这种限制是出于安全方面的考虑,可防止错误和混乱。(1)不能改变C++内部数据类型(如int,float等)的运算符。(2)不能重载‘.’,因为‘.’在类中对任何成员都有意义,已经成为标准用法。(3)不能重载目前C++运算符集合中没有的符号,如#,@,$等。原因有两点,一是难以理解,二是难以确定优先级。(4)对已经存在的运算符进行重原创 2010-02-05 14:32:00 · 1431 阅读 · 0 评论 -
C和指针 的读书笔记(自己整理)
第2章 环境:翻译环境: 源代码转化成可执行的机器指令。执行环境:用于实际执行代码。翻译:源文件-〉目标文件-〉可执行文件(通过链接器将多个目标文件捆绑在一起)编译过程:预处理器-〉源代码经过解析产生目标代码(这个过程中是绝大多数错误和警告产生的地方)-〉优化器(就是对目标代码进行进一步优化,使效率更高)执行:首先,程序被加载到内存,那些不是存储在栈中的未被初始化的变量将在这个原创 2010-02-04 12:28:00 · 2930 阅读 · 0 评论 -
Berkeley套接字
Berkeley套接字应用程序接口(API)包括了一个用C语言写成的应用程序开发库,主要用于实现进程间通讯的功能,在计算机网络通讯方面被广泛使用。Berkeley套接字(也作BSD套接字应用程序接口)刚开始是4.2BSD Unix操作系统(于1983发布)的一套应用程序接口。 Only in 1989, however, could UC Berkeley release versions原创 2010-02-21 16:19:00 · 1172 阅读 · 1 评论 -
select模型
s e l e c t(选择)模型是Wi n s o c k中最常见的I / O模型。之所以称其为“ s e l e c t模型”,是由于它的“中心思想”便是利用s e l e c t函数,实现对I / O的管理!最初设计该模型时,主要面向的是某些使用U n i x操作系统的计算机,它们采用的是B e r k e l e y套接字方案。s e l e c t模型已集成到Winsock 1.1中,它原创 2010-02-21 16:32:00 · 1109 阅读 · 1 评论 -
C++ new/delete 与 new[]/delete[] 详情
new operator: A* pA = new A(); When we use thenew operator,the steps are as follows:Step1: call operator newto allocate the memory as big as sizeof(A).Step2: call the constructor A()原创 2015-09-21 14:49:24 · 443 阅读 · 0 评论 -
makefile实践例子
最近系统学习了下Makefile,自己实现了一个包含文件搜索,并将生成的.o文件单独生成到固定目录下面的例子。文件结构:makefiletestmain.cpub basehead.hprint print.c print.hcommand command.c command.hmakefile文件内容:#变量的定义,用来将原创 2013-04-10 19:51:21 · 812 阅读 · 0 评论 -
static变量在Main函数之前执行分析(C++)
c/c++语言中,在执行main的入口函数之前,是会首先执行一段代码。而对于全局变量和static的初始化就是 在main函数之前执行的,例子如下:#include #include class static_name{public: static_name(){}; static int static_print();private:原创 2013-03-19 20:43:10 · 2389 阅读 · 0 评论 -
memset对数组赋初值探讨
一直认为对数组赋初值memset要比for语句要快,例如下两种方式:int i= 0;char cArry[10]={0};方式一:for(i=0;i{ cArry[i]=0xff;}方式二:memset(cArry,0xFF,sizeof(cArry));今天经过查看memset的反汇编,发现原来memset也是翻译成了for循环语句来进行赋值操作的原创 2012-08-23 18:47:54 · 1727 阅读 · 0 评论 -
TCP状态(选自Windows网络编程技术)
作为一名Wi n s o c k程序员,通常没必要了解实际的T C P状态。但了解T C P状态,就能更好地理解Winsock API调用如何对基层协议中的改变产生影响。此外,许多程序员在关闭套接字时,会碰到一个常见问题;围绕套接字关闭的T C P状态是我们目前最感兴趣的问题。对每个套接字来说,它的初始状态都是C L O S E D。若客户机初始化了一个连接,就会向服务器发送一个S Y N包,原创 2010-03-23 13:49:00 · 1486 阅读 · 0 评论 -
锁定和非锁定套接字
锁定和非锁定套接字模式都存在着优点和缺点。其中,从概念的角度说,锁定套接字更易使用。但在应付建立连接的多个套接字时,或在数据的收发量不均,时间不定时,却显得极难管理。而另一方面,假如需要编写更多的代码,以便在每个Wi n s o c k调用中,对收到一个 W S A E W O U L D B L O C K错误的可能性加以应付,那么非锁定套接字便显得有些难于操作。在这些情况下,可考虑使用“套接字原创 2010-02-22 14:02:00 · 1331 阅读 · 1 评论 -
媒体相关的属性
码率 码率就是数据传输时单位时间传送的数据位数,一般我们用的单位是kbps即千位每秒。 通俗一点的理解就是取样率,单位时间内取样率越大,精度就越高,处理出来的文件就越接近原始文件,也就是说画面的细节就越丰富。但是文件体积与取样率是成正比的,即码率越高视频文件的体积越大。所以几乎所有的编码格式重视的都是如何用最低的码率达到最少的失真,围绕这个核心衍生出来早期的cbr(固定码率)与现在的vbr原创 2010-02-20 16:16:00 · 688 阅读 · 0 评论 -
优先级
如果即将被运行的进程的优先级比正在运行的进程的优先级高,则系统可以强行剥夺正在运行的进程的CPU,让优先级高的进程先运行。在 Windows 中,優先順序由 1 ~ 31 , 1 為最慢, 31 為最高,系統執行時依執行緒為基於程序之優先順序之混合運算後,得到系統中之優先順序,詳細混合運算量級表如下:系統優先順序程序優先順序類別執行緒優先順序等級1I原创 2010-02-22 13:34:00 · 3013 阅读 · 0 评论 -
动态内存会被自动释放吗
来自:高质量c++编程指南函数体内的局部变量在函数结束时自动消亡。很多人误以为示例7-6是正确的。理由是p是局部的指针变量,它消亡的时候会让它所指的动态内存一起完蛋。这是错觉! void Func(void){ char *p = (char *) malloc(100); // 动态内存会自动释放吗?}示例7-6 试图原创 2010-02-04 12:24:00 · 1413 阅读 · 0 评论 -
使用const提高函数的健壮性
来自:高质量c++编程指南看到const关键字,C++程序员首先想到的可能是const常量。这可不是良好的条件反射。如果只知道用const定义常量,那么相当于把火药仅用于制作鞭炮。const更大的魅力是它可以修饰函数的参数、返回值,甚至函数的定义体。const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。所以很多原创 2010-02-04 12:18:00 · 493 阅读 · 0 评论 -
VC下:文件操作的一些API
在VC中,大多数情况对文件的操作都使用系统提供的 API 函数,但有的函数我们不是很熟悉,以下提供一些文件操作 API 函数介绍: 一般文件操作 APICreateFile打开文件要对文件进行读写等操作,首先必须获得文件句柄,通过该函数可以获得文件句柄,该函数是通向文件世界的大门。 CString LogFilePath = "c://zhu.zhu"; HANDLE hF原创 2010-02-03 22:59:00 · 560 阅读 · 0 评论 -
malloc/free 与new/delete 的区别
malloc/free 的使用要点 函数malloc的原型如下: void * malloc(size_t size); 用malloc申请一块长度为length的整数类型的内存,程序如下: int *p = (int *) malloc(sizeof(int) * length);我们应当把注意力集中在两个要素上:“类型转换”和“size原创 2010-02-03 20:29:00 · 607 阅读 · 0 评论 -
整数溢出
来自:C缺陷与陷阱3.9节c语言中存在两类整数算术运算,有符号运算与无符号运算。在无符号算术运算中,没有所谓的“溢出”一说:所有的无符号运算都是以2的n次方为模,这里的n是结果中的位数。如果算术运算符的一个操作数为有符号整数,另一个为无符号整数,那么有符号整数会被转换成无符号整数,“溢出”也不可能发生。但是,当两个操作数都是有符号数时,溢出就有可能发生,而且溢出的结果是未定义的。当一个运算原创 2010-02-03 20:23:00 · 3149 阅读 · 1 评论 -
什么是标准预定义宏
ANSIC标准定义了以下6种可供C语言使用的预定义宏:---------------------------------------------------------------------------- 宏 名 作 用---------------------------------------------------------------原创 2010-02-03 20:19:00 · 1473 阅读 · 0 评论 -
字符串和内存数据比较函数
strcmp(比较字符串) int strcmp( const char *s1, const char *s2 );strcmp()用来比较参数s1和s2字符串。字符串大小的比较是以ASCII 码表上的顺序来决定,此顺序亦为字符的值。strcmp()首先将s1第一个字符值减去s2第一个字符值,若差值为0则再继续比较下个字符,若差值不为0则将差值返回。例如字符串"Ac"和"ba"比较则会原创 2010-02-03 20:16:00 · 4694 阅读 · 0 评论 -
总线错误和段错误相关概念
来自:c专家编程.P157在UNIX上编程时,经常会遇到如下两个常见的运行时错误:bus error (总线错误)segmentation fault (段错误) 总线错误总线错误几乎都是由于未对齐的读或写造成的。它之所以称为总线错误,是因为出现未对齐的内存访问请求时,被堵塞的组件就是地址总线。对齐的意思就是数据项只能存储在地址是数据项大小的整数倍的内存位置上。在原创 2010-02-03 20:13:00 · 1487 阅读 · 0 评论 -
数组作为函数的参数时,不能通过sizeof运算符得到该数组的大小
当把数组作为函数的参数时,你无法在程序运行时通过数组参数本身告诉函数该数组的大小,因为函数的数组参数相当于指向该数组第一个元素的指针。这意味着把数组传递给函数的效率非常高,也意味着程序员必须通过某种机制告诉函数数组参数的大小。为了告诉函数数组参数的大小,人们通常采用以下两种方法:第一种方法是将数组和表示数组大小的值一起传递给函数,例如memcpy()函数就是这样做的: memcpy( d原创 2010-02-03 19:57:00 · 3870 阅读 · 1 评论 -
ACE_Message_Block相关的介绍
ACE_Message_Block在Ace中用来表示消息的存放空间,可用做网络通信中的消息缓冲区,使用非常频繁,下面将在如下方简单的介绍一下ACE_Message_Block相关功能。1. 创建消息块 2. 释放消息块 3. 从消息块中读写数据 4. 数据的拷贝 5. 其它常用函数 1。创建消息块 创建消息块的方式比较灵活,常用的有以下几种原创 2010-01-29 15:45:00 · 742 阅读 · 0 评论 -
ace的安装和配置相关资料整理
操作系统:Windows XP 专业版 编译环境:VS2005中文版 ACE版本:ACE-5.5.1 安装过程: 下载安装包。 Ace的安装文件可以在[url]http://download.dre.vanderbilt.edu/[/url]中下载到,由于我是在windows环境下安装并且不需要TAO等其它库,便下载了ACE-5.5.1.zip。 下载完成后将其解压。我的解压路径为D:/Devel原创 2010-01-29 15:48:00 · 541 阅读 · 0 评论 -
NULL和NUL的区别
NULL是在头文件中专门为空指针定义的一个宏。NUL是ASCII字符集中第一个字符的名称,它对应于一个零值。C语言中没有NUL这样的预定义宏。注意:在ASCII字符集中,数字0对应于十进制值48,不要把数字0和/0(NUL)的值混同起来。NULL可以被定义为(void *)0,而NUL可以被定义为/0。NULL和NUL都可以被简单地定义为0,这时它们是等价的,可以互换使用,但这是一种不原创 2010-02-03 19:54:00 · 5830 阅读 · 0 评论 -
常见的动态内存错误
来自:c和指针.P223在使用动态内存分配的程序中,常常会出现许多错误。这些错误包括对NULL指针进行解除引用操作、对分配的内存进行操作时越过边界、释放并非动态分配的内存、试图释放一块动态分配的内存的一部分以及一块动态内存被释放之后还继续使用它。以下是一些需要注意的事项:1、在请求动态内存分配时,要检查所请求的内存是否成功分配。2、操作内存时,不要超过动态分配的内存的边界。对分配的内存之外的区原创 2010-02-03 20:11:00 · 572 阅读 · 0 评论 -
随机数的相关概念
来自:c和指针.P328有些程序每次执行时不应该产生相同的结果,如游戏和模拟,此时随机数就非常有用。下面两个函数合在一起使用能够产生伪随机数。之所以如此称呼是因为它们通过计算产生随机数,因此有可能重复出现,所以并不是真正的随机数。int rand( void );void srand( unsigned int seed );rand返回一个范围在0和RAND_MAX(至少为3原创 2010-02-03 20:26:00 · 727 阅读 · 0 评论 -
= 不同于 ==
来自:c缺陷与陷阱1.1节当形如e1 = e2这样的表达式出现在语句的条件判断部分时,有些编译器会给出警告消息。当确实需要对变量进行赋值并检查该变量是否为0时,为了避免来自编译器的警告,我们不应该简单的关闭警告选项,而应该显示的进行比较。也就是说,下面的例子:if( x = y ) foo();应该改写为:if( ( x = y ) != 0 ){原创 2010-02-03 20:21:00 · 536 阅读 · 0 评论 -
在程序退出main()函数之后,还有可能执行一部分代码吗?
可以,但这要借助C库函数atexit()。利用atexit()函数可以在程序终止前完成一些“清理”工作——如果将指向一组函数的指针传递给atexit()函数,那么在程序退出main()函数后(此时程序还未终止)就能自动调用这组函数。在使用atexit()函数时你要注意这样两点:第一: 由atexit()函数指定的要在程序终止前执行的函数要用关键字void说明,并且不能带参数;第二: 由at原创 2010-02-03 20:12:00 · 920 阅读 · 0 评论 -
malloc()、calloc()、realloc()
函数malloc()和calloc()都可以用来分配动态内存空间,但两者稍有区别。malloc()函数有一个参数,即要分配的内存空间的大小: void *malloc(size_t size); calloc()函数有两个参数,分别为元素的数目和每个元素的大小,两个参数的乘积就是要分配的空间的大小: void *calloc(size_t numElements,原创 2010-02-03 20:11:00 · 495 阅读 · 0 评论 -
强制类型转换相关概念
来自:c专家编程.P187.强制类型转换(cast)这个术语从C语言一诞生就开始使用,即用于类型转换,也用于消除类型歧义。可以很容易地把某种类型的数据强制转换为基本类型的数据:在括号里写上新类型的名称,然后把它们放在需要转化类型的表达式的前面。在强制转换一个更为复杂的类型时,可以采取如下的方法:1、 一个对象的声明,它的类型就是想要转换的结果类型;2、原创 2010-02-03 20:09:00 · 1397 阅读 · 0 评论 -
慎用内联函数
内联能提高函数的执行效率,为什么不把所有的函数都定义成内联函数? 如果所有的函数都是内联函数,还用得着“内联”这个关键字吗? 内联是以代码膨胀(复制)为代价,仅仅省去了函数调用的开销,从而提高函数的执行效率。如果执行函数体内代码的时间,相比于函数调用的开销较大,那么效率的收获会很少。另一方面,每一处内联函数的调用都要复制代码,将使程序的总代码量增大,消耗更多的内存空间。以下情况原创 2010-02-05 14:28:00 · 751 阅读 · 0 评论 -
返回整数的getchar函数
来自:C缺陷与陷阱5.1节我们首先看下面的这个例子:#include int main(){char c; /* 改成:int c 就正确了 */ while( ( c = getchar() ) != EOF ) { putchar( c ); } return 0;}原创 2010-02-03 20:24:00 · 1675 阅读 · 0 评论