函数指针

C++动态内存:(二)重载new和delete

别等时光非礼了梦想. 提交于 2019-12-13 14:36:57
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 一、重载的原因 用new创建动态对象时会发生两件事:(1)使用operatoe new()为对象分配内存(经常是调用malloc)(2)调用构造函数来初始化内存。相对应的调用delete运算符会(1)首先调用析构函数(2)调用operator delete()释放内存(经常是调用free)。我们无法控制构造函数和析构函数的调用,是由编译器调用的。但可以改变内存分配函数operator new()和operator delete()。链接:C++中的new/new[],delete/delete[] 使用了new和delete的内存分配系统是为了通用目的而设计的,但是在特殊的情形下并不能满足需要。最常见的改变分配系统的原因常常是出于效率考虑: (1)增加分配和归还的速度。创建和销毁一个特定的类的非常多的对象,以至于这个运算成了速度的瓶颈。 (2)堆碎片。分配不同大小的内存会在堆上产生很多碎片,以至于虽然内存可能还有,但由于都是碎片,找不到足够大的内存块来满足需要。通过为特定的类创建自己的内存分配器,可以确保这种情况不会发生。例如在嵌入式和实时系统里,程序可能必须在有限资源情况下运行很长时间,这样的系统就要求内存花费相同的时间且不允许出现堆内存耗尽或者出现很多碎片。 (3)检测运用上的错误。例如:new所得的内存

c语言string函数详解

旧城冷巷雨未停 提交于 2019-12-12 22:24:32
文章转自:https://blog.csdn.net/yukadimun/article/details/81388977 @函数原型: char *strdup(const char *s) 函数功能: 字符串拷贝,目的空间由该函数分配 函数返回: 指向拷贝后的字符串指针 参数说明: src-待拷贝的源字符串 所属文件: <string.h> [cpp] view plain copy #include <stdio.h> #include <string.h> #include <alloc.h> int main() { char *dup_str, *string=“abcde”; dup_str=strdup(string); printf("%s", dup_str); free(dup_str); return 0; } @函数名称: strcpy 函数原型: char* strcpy(char* str1,char* str2); 函数功能: 把str2指向的字符串拷贝到str1中去 函数返回: 返回str1,即指向str1的指针 参数说明: 所属文件: <string.h> [cpp] view plain copy #include <stdio.h> #include <string.h> int main() { char string[10]; char

__cdecl __stdcall

℡╲_俬逩灬. 提交于 2019-12-12 13:47:44
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 1.如果函数func是__cdecl(默认调用方式),调用时情况如下 int main() { // 参数从右到左压栈 push 4 push 3 push 2 push 1 call func add esp 0x10 // 调用者恢复堆栈指针esp,4个参数的大小是0x10(4x4) } 2.如果函数func是__stdcall,调用时情况如下 int main() { // 参数从右到左压栈 push 4 push 3 push 2 push 1 call func // 恢复堆栈指针由被调用者func负责,方法是"ret 0x10" } 3.如果函数func是__pascal,调用情况如下 int main() { // 参数从左到右压栈 push 1 push 2 push 3 push 4 call func // 恢复堆栈指针由被调用者func负责,方法是"ret 0x10" } 3.如果函数func是__fastcall,调用情况如下 int main() { // 参数先用ecx, edx, eax传递,然后再压栈 // 不进栈 // (不知为什么,帮助中写的是从左到右传递的, // 是不是错了,还是bcb6和bcb5的不一样) push 4 mov ecx 3 mov edx 2 mov

go语言指针变量做函数参数

删除回忆录丶 提交于 2019-12-11 13:05:57
package main import "fmt" func main() { /* 定义局部变量 */ var a int = 100 var b int= 200 fmt.Printf("交换前 a 的值 : %d\n", a ) fmt.Printf("交换前 b 的值 : %d\n", b ) /* 调用函数用于交换值 * &a 指向 a 变量的地址 * &b 指向 b 变量的地址 */ swap(&a, &b); fmt.Printf("交换后 a 的值 : %d\n", a ) fmt.Printf("交换后 b 的值 : %d\n", b ) } func swap(x *int, y *int) { var temp int temp = *x /* 保存 x 地址的值 */ *x = *y /* 将 y 赋值给 x */ *y = temp /* 将 temp 赋值给 y */ } /* 交换函数这样写更加简洁,也是 go 语言的特性,类似于python,相当于tuple元组赋值。 */ func swap(x *int, y *int){ *x, *y = *y, *x } 还有一种更更简洁的交换,不需要交换函数swap: b:=5 c:=6 b,c=c,b //直接在变量定义里,把两个值调换。 来源: CSDN 作者: talkingmute 链接:

C++文件读写详解(ofstream,ifstream,fstream)

拈花ヽ惹草 提交于 2019-12-10 16:11:41
在看C++编程思想中,每个练习基本都是使用ofstream,ifstream,fstream,以前粗略知道其用法和含义,在看了几位大牛的博文后,进行整理和总结: 这里主要是讨论fstream的内容: [java] view plain copy print ? #include <fstream> ofstream //文件写操作 内存写入存储设备 ifstream //文件读操作,存储设备读区到内存中 fstream //读写操作,对打开的文件可进行读写操作 1.打开文件 在fstream类中,成员函数open()实现打开文件的操作,从而将数据流和文件进行关联,通过ofstream,ifstream,fstream对象进行对文件的读写操作 函数:open() [cpp] view plain copy print ? <span style= "font-family:Times New Roman;font-size:16px;" > public member function void open ( const char * filename, ios_base::openmode mode = ios_base::in | ios_base::out ); void open( const wchar_t *_Filename, ios_base::openmode

C++实现的委托机制简单实现

心不动则不痛 提交于 2019-12-10 15:58:10
转载自https://blog.csdn.net/gouki04/article/details/6852394 1.引言 下面的委托实现使用的MyGUI里面的委托实现,MyGUI是一款强大的GUI库,想理解更多的MyGUI信息,猛击这里 http://mygui.info/ 最终的代码可以在这里下载: http://download.csdn.net/detail/gouki04/3641328 我们的目标是要实现一个跟.NET几乎完全一样的委托,使用简单,支持多播,可以添加删除委托。同时支持C++的普通函数、模板函数、类成员函数,类的静态成员函数,并且支持多态。使用方式如下: // 普通函数void normalFunc(){ cout << "func1" << endl; }class Base{public:// 类成员函数void classFunc(){ cout << "Base func1" << endl; }};int main(){Base b;CMultiDelegate myDelegate;myDelegate += newDelegate(normalFunc);myDelegate += newDelegate(&b, &Base::classFunc);myDelegate(); //

C++文件操作详解(ifstream、ofstream、fstream)

爱⌒轻易说出口 提交于 2019-12-10 15:57:20
C++ 通过以下几个类支持文件的输入输出: ofstream: 写操作(输出)的文件类 (由ostream引申而来) ifstream: 读操作(输入)的文件类(由istream引申而来) fstream: 可同时读写操作的文件类 (由iostream引申而来) 打开文件(Open a file) 对这些类的一个对象所做的第一个操作通常就是将它和一个真正的文件联系起来,也就是说打开一个文件。被打开的文件在程序中由一个流对象(stream object)来表示 (这些类的一个实例) ,而对这个流对象所做的任何输入输出操作实际就是对该文件所做的操作。 要通过一个流对象打开一个文件,我们使用它的成员函数open(): void open (const char * filename, openmode mode); 这里filename 是一个字符串,代表要打开的文件名,mode 是以下标志符的一个组合: ios::in 为输入(读)而打开文件 ios::out 为输出(写)而打开文件 ios::ate 初始位置:文件尾 ios::app 所有输出附加在文件末尾 ios::trunc 如果文件已存在则先删除该文件 ios::binary 二进制方式 这些标识符可以被组合使用,中间以”或”操作符(|)间隔。例如,如果我们想要以二进制方式打开文件"example.bin" 来写入一些数据

CUDA学习日记(一):thrust::device_pointer_cast(pnt* p)

谁说胖子不能爱 提交于 2019-12-10 15:40:11
thrust::device_pointer_cast(pnt* p)是thrust库中的一个指针类型转换函数,可将其他类型指针转换为thrust::device_ptr指针,其作用与thrust::raw_pointer_cast(pnt* p)刚好相反。 经过类型转换,就可以很方便的使用thrust::sort等函数,而无需将其赋值给thrust::device_vector。 sample有时间再贴上来 来源: CSDN 作者: 博天影帝 链接: https://blog.csdn.net/qq_38337943/article/details/103475821

jni详解(摘自《jni详解》)

北战南征 提交于 2019-12-10 14:08:18
本书涵盖了 Java Native Interface(JNI)的内容,将探讨以下问题: • 在一个 Java 项目中集成一个 C/C++库 • 在一个用 C/C++开发的项目中,嵌入 JavaVM • 实现 Java VM • 语言互操作性问题,特别是互操作过程中的垃圾回收(GC, garbage collection)和并 发编程(multithreading) 译注: JNI(Java Native Interface)是 SUN 定义的一套标准接口,如 Dalvik, Apache Harmony 项目...等 Java 虚拟机,都会实现 JNI 接口,供本地(C/C++)应用与 Java VM 互调。 JNI: 可以供 Java 代码调用本地代码,本地代码也可以调用 Java 代码,即上文列出的第 4 条内容:语言互操作;所以,这是一套完善而功能强大的接口。 可能有朋友听说过 KNI,那是 J2ME VM(CLDC)中定义的一套东西,不如 JNI 强大。 此外,因为 C/C++在系统编程领域的地位,只要打通了与 C/C++的接口,就等于是天堑变 通途。 首先,通过本书,你会很容易的掌握 JNI 开发,并能了解到方方面面的关于 JNI 的知识。 本书详尽的叙述,会带给你你很多如何高效使用 JNI 的启示。JNI 自 1997 年初发布以来, Sun 的工程师们和 Java

SD卡文件操作

≡放荡痞女 提交于 2019-12-10 14:08:11
Fatfs文件系统常用函数:f_mount、f_open、f_close、f_read、f_write、f_lseek、f_truncate、f_sync、f_opendir FatFS是一个为小型嵌入式系统设计的通用FAT(File Allocation Table)文件系统模块。FatFs 的编写遵循ANSI C,并且完全与磁盘I/O层分开。因此,它独立(不依赖)于硬件架构。它可以被嵌入到低成本的微控制器中,如AVR, 8051, PIC, ARM, Z80, 68K 等等,而不需要做任何修改。 特点:Windows兼容的FAT文件系统,不依赖于平台,易于移植,代码和工作区占用空间非常小,多种配置选项:多卷(物理驱动器和分区)、多ANSI/OEM代码页,包括DBCS、在ANSI/OEM或Unicode中长文件名的支持、RTOS的支持、多扇区大小的支持、只读,最少API,I/O缓冲区。 应用程序接口: FatFs 模块为应用程序提供了下列函数,这些函数描述了FatFs能对FAT卷执行哪些操作。 1.f_mount:在FatFs模块上注册/注销一个工作区(文件系统对象) 2.f_open:创建/打开一个用于访问文件的文件对象 3.f_close:关闭一个打开的文件 4.f_read:从一个文件读取数据 5.f_write:写入数据到一个文件 6.f_lseek