函数指针

enable_shared_from_this用法分析

…衆ロ難τιáo~ 提交于 2019-12-06 06:56:05
一、背景 在 为什么需要异步编程 文章末尾提到,"为了使socket和缓冲区(read或write)在整个异步操作的生命周期一直保持活动,我们需要采取特殊的保护措施。你的连接类需要继承自enabled_shared_from_this,然后在内部保存它需要的缓冲区,而且每次异步调用都要传递一个智能指针给this操作"。本文就详细介绍为什么使用enabled_shared_from_this就能保证对象的生命周期,以及enabled_shared_from_this内部的具体实现分析。 二、为什么需要保证对象生命周期 首先想象下同步编程,比如socket建立connect后,read或者write数据,因为是同步阻塞的,数据传输完后,socket对象就已经完成了此次任务,此时就算对象销毁,也并不会引起异常。但是异步编程就不一样了,当一个线程调用一个异步函数(例如:该函数还是socket写文件任务),该函数会立即返回,尽管规定的任务还没有完成,这样线程就会执行异步函数的下一条语句,而不会被挂起。只有当"写文件任务"完成后,由新的线程发送完成消息来执行结果同步,但是当新的线程完成"写文件任务"后,再发送过来,此时异步函数调用方对象是否还存在,这就是个需要解决的问题,这也就是为什么需要保证对象的生命周期。 更加直白一点的例子,假设你需要做下面的操作: io_service service;

XADC

社会主义新天地 提交于 2019-12-06 04:56:35
XADC实验 1、XADC概述 Xilinx7系列内部自带一个双通道12位分辨率的高速(1MSPS 1M sample per second)采样速率的模拟混合信号处理模块,双通道的ADC支持单极和差分工作模式,最多支持17路外部模拟输入通道。称为XADC(Xilinx Analog signal Module),有JTAG和DRP(Dynamic Reconfiguration Port)接口,用于访问状态寄存器和控制寄存器(DRP),其中控制寄存器可以通过DRP进行读写从而实现XADC的初始化配置,状态寄存器只可进行读取操作,ADC将采样转换后的值保存在对应的状态寄存器,通过DRP即可将其读出。 单极工作模式和差分工作模式: 单极工作模式是指AD的模拟电压输入口检测到的电压相当于对地电压。单端输入只有一个输入引脚ADCIN,使用公共端作为电路的返回端,这种方式的优点是简单,缺点是如果Vin受到干扰,由于GND电位始终是0,所以最终ADC的采样值也会随着干扰而变化。 差分工作模式是指检测两个输入口之间的电压,比如一个是3.0V另一个是2.5V,如果两者进入差分工作模式,检测到的电压等于其差值,即0.5V。通常这两根差分线会布线在一起,所以他们收到的干扰是相近的,输入共模干扰,在输入ADC时会被减掉,从而降低了干扰,缺点是接线复杂 2、源码分析 源码main.c文件 /* *

普通函数指针和指向成员函数指针

荒凉一梦 提交于 2019-12-06 03:23:23
函数指针 最近在研究STL的函数适配器时,才发现自己对函数指针其实也不太熟悉,所以决定写下这篇文章记录一下,以便将来又忘了的时候可以看看,说不定有人会因此而受益(虽然我也知道好象不太可能有人来看我的Blog)。 以下是最基本的函数指针的用法(指向外部函数): #include using namespace std; void fun1(); void fun2(); int main() { void (*pF)(); pF = &fun1; (*pF)(); pF = &fun2; (*pF)(); system ("pause"); return 0; } void fun1() { cout << "fun1" << endl; } void fun2() { cout << "fun2" << endl; } 虽然说上面一段代码中的(*pF)()用pF()代替在大部分编译器上(至少我没遇到过不能通过编译的编译器)可以通过编译运行得很好并且看上去优雅多了,但是请记住(*pF)()才是真正符合标准的调用方法。BTW如果你觉得void (*pF)();难看得很可以这样写将它替换成typedef void (* Fun)(); Fun pF; 好了,接下来我们去看看指向类成员函数的函数指针: #include using namespace std; class Test {

FreeRTOS----调度器

我们两清 提交于 2019-12-06 02:39:20
FreeRTOS----调度器 调度器的启动流程分析 当创建完任务之后,会调用vTaskStartScheduler()函数,启动任务调度器; void vTaskStartScheduler( void ) { /* 部分代码如下: */ BaseType_t xReturn; xReturn = xTaskCreate( prvIdleTask, configIDLE_TASK_NAME, configMINIMAL_STACK_SIZE, ( void * ) NULL, portPRIVILEGE_BIT, &xIdleTaskHandle ); #if ( configUSE_TIMERS == 1 ) { if( xReturn == pdPASS ) { xReturn = xTimerCreateTimerTask(); } else { mtCOVERAGE_TEST_MARKER(); } } #endif /* configUSE_TIMERS */ if( xReturn == pdPASS ) { #ifdef FREERTOS_TASKS_C_ADDITIONS_INIT { freertos_tasks_c_additions_init(); } #endif portDISABLE_INTERRUPTS(); #if ( configUSE

Linux堆的一些基础知识

吃可爱长大的小学妹 提交于 2019-12-06 00:49:07
目录 堆的概述 什么是堆 堆的基本操作 堆操作背后的系统调用 堆的相关数据结构 微观结构 malloc_chuck chunk相关宏 bin 宏观结构 arena heap_info malloc_state 深入了解堆实现 堆初始化 malloc_consolidate() 创建堆 unlink 申请内存块 _libc_malloc _int_malloc 释放内存块 _libc_free 内容来源 堆的概述 什么是堆 堆用来在程序运行时动态的分配内存,对其实就是虚拟空间里从地址向高地址增长的连续的线性区域。 堆的基本操作 void *malloc(unsigned int size):作用是在内存的动态存储区中分配一个长度为size的连续空间。此函数的返回值是分配区域的起始地址,或者说,此函数是一个指针型函数,返回的指针指向该分配域的开头位置。 void free(void *ptr):释放之前调用 calloc、malloc 或 realloc 所分配的内存空间。 堆操作背后的系统调用 brk():将数据段(.data)的最高地址指针_edata往高地址推。(从堆头开始,参数为地址) mmap():在进程的虚拟地址空间中(堆和栈中间,称为文件映射区域的地方)找一块空闲的虚拟内存。(分配大于128k) sbrk():将地址指针往高地址推。(从当前指针位置开始,参数为指针增量)

Go 语言入门(一)基础语法

怎甘沉沦 提交于 2019-12-06 00:21:19
写在前面 在学习 Go 语言之前,我自己是有一定的 Java 和 C++ 基础的,这篇文章主要是基于 A tour of Go 编写的,主要是希望记录一下自己的学习历程,加深自己的理解 Go 语言入门(一)基础语法 本地安装 Go 语言环境 关于如何安装 Go 语言的编程环境,我推荐大家看 这篇文章 编写 Hello, World 学习语言时,首先编写一个「Hello, World」已经成了程序员的习惯,这里我们也编写一个,顺便测试一下 Go语言环境是否搭建成功了: 首先创建一个名为 hello.go 的文件,编写代码如下: package main import "fmt" func main() { fmt.Printf("Hello, World\n") } 接着我们在命令行中使用 go 工具运行它: $ go run hello.go Hello, World 如果像上面一样看到了「Hello, World」信息,则表示我们已经迈出学习 Go 语言的第一步了。 关于更多 Go 语言的编程方法已经相应命令,我们可以看 这里 ,它为我们清楚地介绍了 Go 语言的环境变量等相关设置。 在都搭建完成之后,我们就可以进入 Go 语言的语法学习了。 包、变量和函数 学习 Go 语言语法之前,我们要知道他是在「C语言」的基础之上发展的,所以他们之间很多语法都是相似的。 包 声明包和导入包

C语言 sizeof()用法介绍

爱⌒轻易说出口 提交于 2019-12-05 19:08:20
本文 转自https://www.cnblogs.com/huolong-blog/p/7587711.html 1. 定义 sizeof是一个操作符(operator)。 其作用是返回一个对象或类型所占的内存字节数。 2. 语法 sizeof有三种语法形式: 1) sizeof (object); //sizeof (对象) 2) sizeof object; //sizeof 对象 3) sizeof (type_name); //sizeof (类型) 对象可以是各种类型的变量,以及表达式(一般sizeof不会对表达式进行计算)。 sizeof对对象求内存大小,最终都是转换为对对象的数据类型进行求值。 sizeof (表达式); //值为表达式的最终结果的数据类型的大小 举例: int i; sizeof(int); //值为4 sizeof(i); //值为4,等价于sizeof(int) sizeof i; //值为4 sizeof(2); //值为4,等价于sizeof(int),因为2的类型为int sizeof(2 + 3.14); //值为8,等价于sizeof(double),因为此表达式的结果的类型为double char ary[sizeof(int) * 10]; //OK,编译无误 1. 基本数据类型的sizeof 这里的基本数据类型是指short

用指针形式实现strstr函数

巧了我就是萌 提交于 2019-12-05 02:27:33
char * mystrstr(char *dest,char * src) { char *p=null; char * temp=src; while(*dest)//只要不为'\0'就行 { p=dest;//进行多次赋值操作 while(*dest==*temp) { dest++;//指向下一个值的地址 temp++; } if(!*temp)//相当于if(*temp=='\0') return p; else temp=src;//重置了目标字符串 dest=p;//重置字符串,并指向下一个 dest++ } return NULL; } int main() { char *p = mystrstr("helllllo", "lllllo"); printf("%s\n", p); system("pause"); return EXIT_SUCCESS; } 来源: https://www.cnblogs.com/mingstatebird/p/11897752.html

C++类的定义和对象

时光总嘲笑我的痴心妄想 提交于 2019-12-05 01:51:46
C++类的定义和对象 类的成员变量称为类的属性(Property),将类的成员函数称为类的方法(Method)。在面向对象的编程语言中,经常把函数(Function)称为方法(Method)。 类的定义 class Student{ public: //成员变量 char *name; int age; float score; void say(){ cout<<name<<age<<score<<endl; } }; 类只是一个模板(Template),编译后不占用内存空间. class C++ 中新增的关键字,用来定义类。 成员变量和成员函数,它们统称为类的成员(Member) 创建对象: Student Lilei; //创建对象 Student 是类名, liLei 是对象名。和使用基本类型定义变量的形式类似, 从这个角度考虑,我们可以把 Student 看做一种新的数据类型,把 liLei 看做一个变量。 在创建对象时,class 关键字可要可不要 class Student LiLei; //正确 Student LiLei; //同样正确 还可以创建对象数组: Student allStu[100]; 使用对象指针: Student stu; //pStu 是一个指针,它指向 Student 类型的数据,通过 Student 创建出来的对象 Student

Go 语言小记

一笑奈何 提交于 2019-12-05 01:00:52
本文主要是读 的笔记. 本文稍欠缺些整理. 简介 本节主要是对Go的一些主要内容进行基础的介绍 语法特点 变量类型的声明 类型放到变量名之后 函数可以返回多个变量 defer 可以延迟函数的调用(形成一个先进后出的defer栈) 存在指针类型,但没有指针运算 在定义变量时没有进行赋值,默认赋值为”零值”,数值类型默认为0,布尔类型默认为false字符串默认为空”” 支持类型推到 存在结构体 return 可以返回多个值以逗号分割 package main import "fmt" type MyStruct struct { x int y int } func main()( int , int ){ var a float64 = 1.0 var p * int s := MyStruct {1 ,2 } fmt.Println(s.x) i := &a j := 1 return i,j } 基本类型 bool string int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 uintptr byte // uint8 的别名 rune // int32 的别名 // 代表一个Unicode码 float32 float64 complex64 complex128 string 类型操作