函数指针

C程序的内存分配及动态内存

走远了吗. 提交于 2019-12-25 02:56:02
1、程序内存的分配 一个由C/C++编译的程序占用的内存分为以下几个部分: 1)栈区(stack) — 由编译器自动分配释放 , 存放为运行函数而分配的局 部变量、 函数参数、 返回数据、 返回地址等。 其操作方式类似于数据结构中的 栈。 2)堆区(heap) — 一般由程序员分配释放, 若程序员不释放, 程序结束 时可能由OS回收,否则程序就会存在内存泄漏的问题 。 分配方式类似于链表。 3)全局区(静态区) (static) —存放全局变量、 静态数据、 常量。 程序结 束后由系统释放。 4)文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放。 5) 程序代码区—存放函数体(类成员函数和全局函数) 的二进制代码 内存分配方式有三种: 1)从静态存储区域分配: 内存在程序编译的时候就已经分配好, 这块内存在程序的整个运行期 间都存在。 例如全局变量, static 变量。 2)在栈上创建: 在执行函数时, 函数内局部变量的存储单元都可以在栈上创建, 函数 执行结束时这些存储单元自动被释放。 栈内存分配运算内置于处理器 的指令集中, 效率很高, 但是分配的内存容量有限。 3)从堆上分配: 亦称动态内存分配。 程序在运行的时候用 malloc 或 new 申请任意多少的内存, 程序员自己负责在何时用 free 或 delete 释放内存。 动态内存的生存期由程序员决定,

Rust基础

瘦欲@ 提交于 2019-12-24 18:03:03
一:编译器 Rust的编译器叫rustc,类似javac一样,负责将源代码编译成可执行文件或者库文件(.a/.so/.lib/.dll等) 二:核心库和标准库 Rust语言由核心库和标准库组成,核心库是标准库的基础,核心库不依赖于操作系统和网络相关的库,一般写嵌入式应用会用到; 可以在模块顶部引入#![no_std]来使用核心库; 标准库则一般用来开发应用程序,它提供了开发应用程序所需的基础和跨平台支持,比如println!宏其实就是标准库里的,它依赖操作系统提供的API来实现在标准输出流里打印数据; 三:包管理器 Rust的包管理器是cargo【马车】,而Rust里每个项目编译成的库叫做crate,类似Java里的jar包; cargo除了是包管理器,它还能用于创建可执行程序项目和库项目,命令分别是: 1.cargo new exec_proj 2.cargo new --lib lib_proj 然后可以通过cargo build和cargo run对项目进行编译和允许; 四:Rust的语句和表达式 Rust里语法可以分为两大类,即语句和表达式; 语句是指分号结尾,或者花括号结尾的代码,比如输出语句,变量声明语句或结构体声明语句等等; 表达式则是指没有分号的表达式,如果它处于某个X块或函数最后一行,那么它将自动作为X块或函数的返回值,比如1 + 1就是一个表达式

Uboot启动流程分析(二)

纵然是瞬间 提交于 2019-12-24 06:58:52
1、前言 在前面的文章Uboot启动流程分析(一)中,链接如下: https://www.cnblogs.com/Cqlismy/p/12000889.html 已经简单地分析了low_level_init函数,其调用流程如下: save_boot_params_ret | cpu_init_crit |   | |   lowlevel_init |   | |   s_init | _main 接下来,则继续往下分析_main函数。 2、_main函数 在save_boot_params_ret的最后,会运行bl _main这句代码,Uboot则将会跳转到_main函数中去运行,该函数的定义在arch/arm/lib/crt0.S文件中,_main函数的功能已经在文件中注释得很清楚了,先来看看_main函数实现的功能是什么,注释如下: /* * This file handles the target-independent stages of the U-Boot * start-up where a C runtime environment is needed. Its entry point * is _main and is branched into from the target's start.S file. * * _main execution

【cpp】reference & copy constructor

僤鯓⒐⒋嵵緔 提交于 2019-12-23 22:02:32
最近在看thinking in cpp 其实不是因为闲,恰恰是以为太忙了,大块的时间没有了,只有一些零碎的时间,于是用来学点自己感兴趣的东西 今天看到reference & copy constructor这一章 这本书果然写的很通俗易懂,扫除了我的许多以前的知识盲点。 看到了函数的return value保存在哪个地方的这一章,觉得很有意思 于是做了个实验,研究了一下vs2008中编译出来的汇编代码 最后想清楚了。return value是保存在stack上的 先保存argument,在保存return value的指针 然后再调用cal 为什么这么做? 可以放return value的地方: 1. register。不够大 2. 放在return address的下面。即return address先入栈,然后再把return values入栈。但是很危险,可能会被ISR抢占,然后清除掉return value 3. 在栈中单独开辟一个区域放return value。和C不兼容 采用的办法:在当前栈的空位置中给return value分配一块地方。然后把指向这个地方的指针当做该函数的一个参数压栈。返回值就写到这个指针指向的地方 效率高 明天再确认一下这个事情。 来源: https://www.cnblogs.com/chenhuanfa/p/3474006.html

STL vector简介

荒凉一梦 提交于 2019-12-22 11:34:27
STL vector简介 vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间的目的. 用法: 1.文件包含: 首先在程序开头处加上#include<vector>以包含所需要的类文件vector 还有一定要加上using namespace std; 2.成员函数 1.push_back 在数组的最后添加一个数据 2.pop_back 去掉数组的最后一个数据 3.at 得到编号位置的数据 4.begin 得到数组头的指针 5.end 得到数组的最后一个单元+1的指针 6.front 得到数组头的引用 7.back 得到数组的最后一个单元的引用 8.max_size 得到vector最大可以是多大 9.capacity 当前vector分配的大小 10.size 当前使用数据的大小 11.resize 改变当前使用数据的大小,如果它比当前使用的大,者填充默认值 12.reserve 改变当前vecotr所分配空间的大小 13.erase 删除指针指向的数据项 14.clear 清空当前的vector 15.rbegin 将vector反转后的开始指针返回(其实就是原来的end-1) 16.rend 将vector反转构的结束指针返回(其实就是原来的begin-1)

C++多态性与虚函数

情到浓时终转凉″ 提交于 2019-12-22 00:51:33
  派生一个类的原因并非总是为了继承或是添加新的成员,有时是为了重新定义基类的成员,使得基类成员“获得新生”。面向对象的程序设计真正的力量不仅仅是继承,而且还在于允许派生类对象像基类对象一样处理,其核心机制就是多态和动态联编。 (一)多态性   多态是指同样的消息被不同的对象接收时导致不同的行为。所谓消息是指对类成员函数的调用,不同的行为是指的不同的实现,也就是调用了不同的函数。 1)多态的分类   广义上说,多态性是指一段程序能够处理多种类型对象的能力。在C++中,这种多态性可以通过重载多态(函数和运算符重载),强制重载(类型强制转换),类型参数化多态(模板) ,包含多态(继承与虚函数)四种方式来实现。类型参数化多态和包含多态称为一般多态性,是用来系统地刻画语义上相关的一组类型;重载多态和强制多态性称为特殊多态性,用来刻画语义上无关连的类型间关系。   C++中采用虚函数实现包含多态。虚函数为C++提供了更为灵活的多态机制,这种多态性在程序运行时才能够确定,因此虚函数是多态性的精华,至少含有一个虚函数的类称为多态类。包含多态在面向对象的程序设计中使用很频繁。 2)静态联编   联编又称为绑定,就是将模块或函数合并在一起生成可执行代码的处理过程,同时对每个模块或函数分配内存地址,对外部访问也提供正确的内存地址。   在编译阶段就将函数实现与函数调用绑定起来称为静态联编

objective-c 关键字和概念

梦想与她 提交于 2019-12-21 22:40:20
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> objective-c 关键字和概念 - ithero_zhou的专栏 - 博客频道 - CSDN.NET 关键字 @ 看到这个关键字,我们就应该想到,这是Object-C对C语言的扩展,例如 @interface XXX。 @interface 声明类 @implementation 实现类 @protocol 声明协议 @optional 与@protocol配合使用,说明协议中的某个或者某几个方法可以不实现 @required 与@protocol配合使用,说明协议中的某个方法或者某几个方法必须实现 @end 与 @interface ,@implementation,@protocol配合使用,代表声明或者实现结束 @encode @encode为编译器宏,它可以将类型转换为相应的字符串。 id id是指向Objective-C类对象的指针,它可以声明为任何类对象的指针,当在Objective-C中使用id时,编译器会假定你知道,id指向哪个类的对象。与void*是不同的是,void*编译器不知道也不假定指向任何类型的指针。 nil 定义为一个常量,如果一个指针的值为nil,代表这个指针没有指向任何对象。 self 在Objective-C中,关键字self与c++中this是同一概念

C++中的引用

喜你入骨 提交于 2019-12-20 10:09:14
c++比起c来除了多了类类型外还多出一种类型:引用。这个东西变量不象变 量,指针不象指针,我以前对它不太懂,看程序时碰到引用都稀里糊涂蒙过去。 最近把引用好好地揣摩了一番,小有收获,特公之于社区,让初学者们共享。 引用指的是对一个对象的引用。那么什么是对象?在c++中狭义的对象指的是 用类,结构,联合等复杂数据类型来声明的变量,如 MyClass myclass,CDialo g mydlg,等等。广义的对象还包括用int,char,float等简单类型声明的变量 ,如int a,char b等等。我在下文提到“对象”一词全指的是广义的对象。c++ 的初学者们把这个广义对象的概念建立起来,对看参考书是很有帮助的,因为大 多数书上只顾用“对象”这个词,对于这个词还有广义和狭义两种概念却只字不 提。 一。引用的基本特性 首先让我们声明一个引用并使用它来初步认识引用。 例一: 1。 int v,k,h; 2。 int &rv=v; 3。 rv=3; //此时v的值也同时变成了3。 4。 v=5; 5。 k=rv+2; //此时k=5+2=7。 6。 h=12; 7。 rv=h; 8。 rv=20; 第1句声明了三个对象(简单变量)。 第2句的意思是:声明了一个引用,名字叫rv,它具有int类型,或者说它是 对int类型的引用,而且它被初始化为与int类型的对象v“绑定”在一起。此时r

C++的引用类型

北城以北 提交于 2019-12-20 09:37:49
c++比起c来除了多了类类型外还多出一种类型:引用。这个东西变量不象变 量,指针不象指针,我以前对它不太懂,看程序时碰到引用都稀里糊涂蒙过去。 最近把引用好好地揣摩了一番,小有收获,特公之于社区,让初学者们共享。 引用指的是对一个对象的引用。那么什么是对象?在c++中狭义的对象指的是 用类,结构,联合等复杂数据类型来声明的变量,如 MyClass myclass,CDialo g mydlg,等等。广义的对象还包括用int,char,float等简单类型声明的变量 ,如int a,char b等等。我在下文提到“对象”一词全指的是广义的对象。c++ 的初学者们把这个广义对象的概念建立起来,对看参考书是很有帮助的,因为大 多数书上只顾用“对象”这个词,对于这个词还有广义和狭义两种概念却只字不 提。 一。引用的基本特性 首先让我们声明一个引用并使用它来初步认识引用。 例一: 1。 int v,k,h; 2。 int &rv=v; 3。 rv=3; //此时v的值也同时变成了3。 4。 v=5; 5。 k=rv+2; //此时k=5+2=7。 6。 h=12; 7。 rv=h; 8。 rv=20; 第1句声明了三个对象(简单变量)。 第2句的意思是:声明了一个引用,名字叫rv,它具有int类型,或者说它是 对int类型的引用,而且它被初始化为与int类型的对象v“绑定”在一起。此时r

系统调用

痞子三分冷 提交于 2019-12-18 22:57:29
由前2篇文章做基础,现在可以理解系统调用了。 用户空间栈&系统空间栈 中断&异常 系统调用定义 系统调用是内核提供的一系列强大的函数。它们在内核中实现,然后通过一定的方式(X86是软中断,也即门陷入)呈现给用户,是用户程序与内核交互的接口。 注意,我们在程序中用调用read、write函数时,这些不是系统调用函数,而是glibc库包装后,进行一些处理,然后再调用系统调用。如果想在程序中直接调用 的 话,需要调用_syscall()函数。 上下文(context) 上下文简单说来就是一个环境,相对于进程而言,就是进程执行时的环境。具体来说就是各个变量和数据,包括所有的寄存器变量、进程打开的文件、内存信息等。 一个进程的上下文可以分为三个部分:用户级上下文、寄存器上下文以及系统级上下文。 用户级上下文: 正文、数据、用户堆栈以及共享存储区; 寄存器上下文: 通用寄存器、程序寄存器(IP)、处理器状态寄存器(EFLAGS)、栈指针(ESP); 系统级上下文: 进程控制块task_struct、内存管理信息(mm_struct、vm_area_struct、pgd、pte)、内核栈。 当发生进程调度时,进行进程切换就是上下文切换(context switch).操作系统必须对上面提到的全部信息进行切换,新调度的进程才能运行。而系统调用进行的模式 切换(mode switch)