
C/C++
zpznba
日日行,不怕千万里。常常做,不怕千万事。
展开
-
C语言中 typedef 定义的函数指针
在 C 里面,可以用 typedef 来为一个已有的数据类型增加一个新的别名。比如:typedef int Length;这种简单的形式,大家都能理解。可是遇到下面这种形式,不少人就傻眼了。比如:typedef int (*PFI)(int, const char *);难道是把 int 数据类型定义成了(*PFI)(int, const char *)的数据类型,可是...转载 2019-12-10 17:10:37 · 1903 阅读 · 0 评论 -
malloc原理和内存分配
当一个进程发生缺页中断的时候,进程会陷入内核态,执行以下操作:1、检查要访问的虚拟地址是否合法2、查找/分配一个物理页3、填充物理页内容(读取磁盘,或者直接置0,或者啥也不干)4、建立映射关系(虚拟地址到物理地址)重新执行发生缺页中断的那条指令如果第3步,需要读取磁盘,那么这次缺页中断就是majflt,否则就是minflt。内存分配的原理从操作系统角度来看,进程分配内存有...转载 2019-05-22 15:45:17 · 1407 阅读 · 0 评论 -
C++ map的三种不同插入元素方法
Talk is cheap. Show you the code!#include <iostream>#include <map>using namespace std;int main(){ map<int,string> student; student.insert(map<int,string>::value_...原创 2019-05-10 19:37:37 · 19657 阅读 · 3 评论 -
C语言中比较两个浮点数是否相等的方法
对两个浮点数判断大小和是否相等不能直接用==来判断,会出错!明明相等的两个数比较反而是不相等!对于两个浮点数比较只能通过相减并与预先设定的精度比较,记得要取绝对值!if( fabs(f1-f2) < 预先指定的精度){ ...}例子#define EPSILON 0.000001 //根据精度需要if ( fabs( fa - fb) < EPSI...转载 2019-04-29 16:08:26 · 2665 阅读 · 0 评论 -
new和delete的实现原理, delete是如何知道释放内存的大小的?
一、 new的原理new简单类型直接调用operator new分配内存;而对于复杂结构,先调用operator new分配内存,然后在分配的内存上调用构造函数;对于简单类型,new[]计算好大小后调用operator new;对于复杂数据结构,new[]先调用operator new[]分配内存,然后在p的前四个字节写入数组大小n,然后调用n次构造函数,针对复杂类型,new[]会额外存储数组...原创 2019-04-29 15:43:16 · 3261 阅读 · 0 评论 -
用C语言实现C++的继承
#include <iostream>using namespace std;//C++中的继承与多态struct A{ virtual void fun() //C++中的多态:通过虚函数实现 { cout<<"A:fun()"<<endl; } int a;};struct B:publ...原创 2019-04-29 14:41:39 · 589 阅读 · 0 评论 -
宏定义(#ifndef+#define+#endif)的作用
在头文件中,我们经常会在头文件中见到#ifndef、#define、#endif三者一起使用的宏定义。例如,在头文件xxx.h中(此样式可参考):#ifndef __XXX_H__#define __XXX_H__#include <iostream> // 其他代码 #endif使用#ifndef、#define、#endif组合宏定义的作用是:防止头文件的...转载 2019-04-19 22:31:19 · 2323 阅读 · 1 评论 -
std::vector的reserve和resize的区别
先看看《C++ Primer》中对resize()函数两种用法的介绍:1、resize(n)调整容器的长度大小,使其能容纳n个元素。如果n小于容器的当前的size,则删除多出来的元素。否则,添加采用值初始化的元素。2、resize(n,t)多一个参数t,将所有新添加的元素初始化为t。而reserver()的用法只有一种reserve(n)预分配n个元素...转载 2019-04-19 15:59:44 · 1499 阅读 · 0 评论 -
C语言怎么做交换两个任意类型变量的值的一个函数
昨天在想写反转字符串的时候,自己写了一个转换两个字符类型的swap():void myswap(char *a,char *b){ char tmp; tmp = *a; *a = *b; *b = tmp;}然后想到C语言中怎么实现泛型的swap?最终在网上找到了这位大佬的答案:int swap(void* lhs, void* rhs, ...原创 2019-04-19 11:54:42 · 1034 阅读 · 0 评论 -
浅谈static的“隐藏性”
关于static的隐藏性体现在两个方面:我们知道,当同时编译多个文件时,所有未加static的全局变量和函数都具有全局可见性,但加上static后的变量,只在当前文件可见; 另外,static变量和全局变量虽然都存在静态存储区,但是static变量可以控制变量的可见范围,这也体现了它的隐藏性。我们接下来举例说明,先来看第二条:#include <stdio.h>...原创 2019-04-27 20:29:00 · 1451 阅读 · 0 评论 -
C++实现一个线程池
说明本线程池使用了互斥锁、条件变量、函数指针等常用工具。线程池的创建与执行threadpool_create创建线程池时,首先分配线程池数组和任务队列数组的空间,然后调用pthread_create创建线程,此时任务队列为空。 这样新创建的线程由于任务队列为空,所以都阻塞了。必须等待任务队列中有任务才能取执行。这部分实现使用条件变量。 当用threadpool_add添加很多任务后,每...原创 2019-04-21 11:16:17 · 906 阅读 · 1 评论 -
C语言中ctype.h文件常用函数总结
1.isalpha:判断字符是不是英文字母:/* isalpha example */#include <stdio.h>#include <ctype.h>int main (){ int i=0; char str[]="C++"; while (str[i]) { if (isalpha(str[i])) printf ("ch...原创 2019-04-02 14:29:12 · 4865 阅读 · 0 评论