C/C++
For_zwb
虚心万事能成;自满十事九空。
展开
-
C++模板编译
传统的编译模型使用C/C++进行编程时,一般会使用头文件以使定义和声明分离,并使得程序以模块方式组织。将函数声明、类的定义放在头文件中,而将函数实现以及类成员函数的定义放在独立的文件中。但是对于模板来说,这种方式是行不通的,具体的例子如下:test.h包含了模板的声明//test.h#ifndef TEST_H#define TEST_Htemplate<typename T> bool compare(const T &a, const T &b);原创 2020-05-13 11:54:23 · 1171 阅读 · 0 评论 -
函数名前加static的作用
static先思考一个问题,static修饰一个变量的作用是什么?它的名字叫做局部静态变量或者全局静态变量,那这个变量到底可以干什么?它有一个作用就是为了让该变量只在自己的编译单元中可见。对于外部文件不可见。编译单元是什么?举个例子吧:现在有一个1.h 文件 内部定义了全局静态变量 static int a = 1;然后有一个1.c文件包含了1.h, 那这个1.c就可以使用这个a...原创 2020-04-07 10:14:22 · 1800 阅读 · 0 评论 -
Linux下如何使用gettid函数且和pthread_self()的区别
gettid它被定义在<sys./types.h>头文件中,但在程序中使用时发现没有gettid函数。我们可以自己封装一下#include<sys/syscall.h>syscall(SYS_gettid); //该函数和gettid等价。在编写程序时可以使用上述函数。也可以将其封装一下。pid_t gettid(){ return syscall...原创 2020-03-31 23:31:13 · 8044 阅读 · 0 评论 -
c++11::shared_from_this()使用方法
shared_from_this()shared_from_this的使用方法:#include<iostream>#include<memory>class my_practice;void func1(std::shared_ptr<my_practice> a){ std::cout << a.use_count() &...原创 2020-03-30 15:20:15 · 1866 阅读 · 4 评论 -
C语言中的强符号与弱符号问题
弱符号与强符号对于C/C++语言来说,编译器默认函数和初始化了的全局变量为强符号,未初始化的全局变量为弱符号。我们也可以通过GCC的__attribute__((weak))将一个强符号变为弱符号。强符号和弱符号都是针对定义来说的,不是针对符号的引用。extern int ext;int weak; //弱符号int strong = 1; //强符号__attribute__((we...原创 2020-03-23 17:52:35 · 495 阅读 · 0 评论 -
函数的传值传址——指针篇
#include<iostream>struct Treenode{ Treenode(int a) : x(a) {} int x; Treenode *next;};void func(Treenode *head){ printf("%p\n", &head); Treenode *temp = new Treen...原创 2020-02-24 17:35:11 · 420 阅读 · 0 评论 -
effectiv c++条款1-11
条款2: 尽量以const, enum, inline 替换#define#define port 8888define可以定常量值,但是它没有作用域,并且它是直接被替换,如果是大型项目,报错显示的是8888而不是port,导致无法追踪该错误。这个问题也会出现在记号表调试中,define的常量没有进入记号表中。具体原因可以看ELF文件解析。define不能被封装,而const可以被封装在...原创 2019-12-28 21:49:20 · 228 阅读 · 0 评论 -
c++中线程传递函数为什么是全局或者静态函数
首先,线程也是一种资源,受系统调度。在计算机中,运行程序都是通过地址来运行,所以,我们必须告知计算机该线程的起始地址,也就是传入函数的地址,所以函数应为全局函数或者静态函数。在c++中,传入线程的函数可能是类中的函数,如果类中的函数不加static进行修饰,可以吗?答案是不可以的。因为在类中,参数列表中都会有一个this指针,例如函数foo(int),在编译之后就会变成foo(int, cla...原创 2019-12-15 19:56:54 · 1409 阅读 · 0 评论 -
进程池详解(linux)
进程池进程池是我们创建一组进程,进程数目可以自己的规定,目的是为了让我们可以并发的去处理任务,此文处理的是网络请求的进程池。采用的是半同步/半反应堆模式的进程池。主进程epoll监听listenfd,如有客户连接根据特定算法将客户连接套接字利用管道发送给进程池中的某个进程,让其进行监听。该算法主要是为了平衡进程池中每个进程epoll监听的套接字数量。防止某个进程监听过多性能降低。然后每个进...原创 2019-10-14 19:21:08 · 919 阅读 · 16 评论 -
线程池(linux)
线程池概念线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。我们将任务添加到任务队列中,线程池得知有任务到来后,会唤醒线程,如若所有线程都在执行任务,则线程会处理完当前任务后,在处理任务队列中的线程。作用线程池可以节省我们的系统资源和时间。线程过多会带来调...原创 2019-08-29 10:00:40 · 235 阅读 · 0 评论 -
C++11中 emplace_back与push_back的区别
使用empalce操作新标准中加入了三个新成员——emplace、emplace_front、emplace_back。这些是操作构造,而不是拷贝构造。这些操作分别对应以前的insert、push_front、push_back。允许我们将元素放置在一个指定位置之前或容器头部或容器尾部。当调用push或insert成员函数时,我们将元素类型的对象传递给它们,这些对象被拷贝到容器中。而当我们调...原创 2018-12-02 19:23:06 · 1627 阅读 · 0 评论 -
迷宫问题(C语言实现)
问题描述定义一个二维数组: int maze[5][5] = {0, 1, 0, 0, 0,0, 1, 0, 1, 0,0, 0, 0, 0, 0,0, 1, 1, 1, 0,0, 0, 0, 1, 0,};它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。 Input 一个5 ×...原创 2018-07-30 23:33:27 · 36621 阅读 · 17 评论 -
strcpy, strncpy, memcpy 三个函数区别和用法
一 strcpy函数函数原型: char * strcpy(char *dst, char *src); 函数概念: strcpy是一种C语言的标准库函数,strcpy把从src地址开始且含有’\0’结束符的字符串复制到以dest开始的地址空间,返回值的类型为char*。如果dst指针原来有数据,调用strcpy函数后,会覆盖dst指针中的数据, 而且要保证dst指针的所分配的内存大于等于...原创 2018-07-29 17:14:44 · 549 阅读 · 0 评论 -
文件操作 ls代码实现总结(-l, -a, -r选项)
代码部分 1 #include&amp;lt;stdio.h&amp;gt; 2 #include&amp;lt;stdlib.h&amp;gt; 3...原创 2018-07-25 22:53:45 · 790 阅读 · 0 评论 -
C语言缓冲区问题
前几天课设写了一个循环:#include<stdio.h>....int ch;char c;ch = getchar();while(ch !='q'){ ....... scanf("%c", &c); ch = getchar();}结果这个...原创 2018-06-27 18:30:04 · 842 阅读 · 3 评论 -
函数的传值和传址调用(C语言)
1:传值调用。传值调用顾名思义就是将参数的值传递给函数,而函数在进行调用时会复制这个值,然后将复制的值在函数中进行调用。void swap(int a, int b){int temp; temp = a; a = b; b = temp;}int main(void){ int ...原创 2018-06-04 20:35:57 · 10765 阅读 · 3 评论