函数指针

重温C++

老子叫甜甜 提交于 2019-12-10 10:01:18
C++ 1 子函数可以把定义放在MAIN函数前, 实现在MAIN函数后 2 函数之间的值传和地址传方式 call ( ) { vector < string > name ; string lastname who_is ( & name , & lastname ) ; cout << name << endl ; } void who_is ( vector < string > * p_firstname , string * p_lastname ) { string l_v_str_firstname ( "曾" ) ; string l_v_str_lastname ( "大侠" ) ; * p_lastname = l_v_str_firstname ; p_firstname - > push_back ( l_v_str_firstname ) ; } 调用函数call把本地变量的name地址传给被调用函数who_is 被调函数声明为指针 string * p_name 给指针赋值 * p_lastname = l_v_str_firstname ; 给指针赋地址 p_name = & l_v_str_firstname 被调函数who_is 不能把函数内部的变量传到外面去,因为函数调用完后就被清除了。 这样函数内部要把工作结果返回出去,一方面可以通过RETRUN

.Neter所应该彻底了解的委托

风流意气都作罢 提交于 2019-12-10 07:27:59
本文将通过引出几个问题来,并且通过例子来剖析C#中的委托以及用法,做抛砖引玉的作用 对于委托我发现大部分人都有以下问题,或者可能在面试中遇过这样的: 委托是不是相当于C/C++的函数指针? 委托究竟是什么? 委托究竟是用来干嘛的? 委托跟匿名函数的区别? 委托与事件的关系? 我们先来声明和使用C++的函数指针: 代码如下: #include <iostream> using namespace std; typedef int (*Foohandle)(int a,int b); int fooMenthod(int a, int (*foohandle1)(int a,int b)) //回调函数 { return a + (*foohandle1)(2,3);//也可以写成foohandle1(2,3) } int add(int a,int b) { return a + b; } int multiply(int a, int b) { return a * b; } int main() { Foohandle foohandle = add; int (*foohandle1)(int a, int b) = &add; cout << foohandle(2,3)<<endl; cout << foohandle1(2,3) << endl; cout <<

java中的函数传参

独自空忆成欢 提交于 2019-12-10 00:38:42
在c/c++中对于传参类型,无外乎就是传值、传引用、传指针这几种。但在java中,由于没有指针类型,其传参的方式也发生了相应的变化。 java中传参方式应该主要有两种:传值和传引用 传值 对于基本数据类型,char int double等,传递的都是变量的副本,属于传值;在函数内部的任何操作都不会影响变量本身,只会影响变量的副本; 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 public class Test { public static void main ( String [ ] args ) { int a 来源: CSDN 作者: 我就是大佬 链接: https://blog.csdn.net/qq_44457564/article/details/103463678

第15章 进程间通行 15.3函数popen和pclose

左心房为你撑大大i 提交于 2019-12-09 20:50:19
<436> (1) FILE * popen (const char * command , const char * type ); popen 函数创建一个连接到另一个进程的管道。 若 type 是“r”,则文件指针连接到 command 的标准输出,可通过文件指针读取 command 的输出。 若 type 是“w”,则文件指针连接到 command 的标准输入,可通过文件指针向 command 发送数据。 int pclose (FILE * stream ); //此例子为用popen向分页程序传送文件。popen创建了连接到分页程序的管道。 #include "apue.h" #include <sys/wait.h> #define PAGER "${PAGER:-more}" /* environment variable, or default */ int main(int argc, char *argv[]) { char line[MAXLINE]; FILE *fpin, *fpout; if (argc != 2) err_quit("usage: a.out <pathname>"); if ((fpin = fopen(argv[1], "r")) == NULL) err_sys("can't open %s", argv[1]); if (

高并发性能调试经验分享

ε祈祈猫儿з 提交于 2019-12-06 22:06:10
引文 4月份的时候看到一道面试题,据说是腾讯校招面试官提的:在多线程和高并发环境下,如果有一个平均运行一百万次才出现一次的bug,你如何调试这个bug?知乎原贴地址如下: 腾讯实习生面试,这两道题目该怎么回答? - 编程 . 遗憾的是知乎很多答案在抨击这道题本身的正确性,虽然我不是这次的面试官,但我认为这是一道非常好的面试题。当然,只是道加分题,答不上,不扣分。答得不错,说明解决问题的思路和能力要超过应届生平均水平。 之所以写上面这段,是因为我觉得大部分后台服务端开发都有可能遇到这样的BUG,即使没有遇到,这样的题目也能够激发大家不断思考和总结。非常凑巧的是,我在4月份也遇到了一个类似的而且要更加严重的BUG,这是我自己挖的一个很深的坑,不填好,整个项目就无法上线。 现在已经过去了一个多月,趁着有时间,自己好好总结一下,希望里面提到的一些经验和工具能够带给大家一点帮助。 项目背景 我们针对nginx事件框架和openssl协议栈进行了一些深度改造,以提升nginx的HTTPS完全握手计算性能。 由于原生nginx使用本地CPU做RSA计算,ECDHE_RSA算法的单核处理能力只有400 qps左右。前期测试时的并发性能很低,就算开了24核,性能也无法超过1万。 核心功能在去年底就完成了开发,线下测试也没有发现问题。经过优化后的性能提升几倍,为了测试最大性能

Spark (三) 性能优化

∥☆過路亽.° 提交于 2019-12-06 20:35:05
参数配置 1、spark-env.sh 2、程序通过SparkConf或System.setProperty 性能观察与日志 1)Web UI。 2)Driver程序控制台日志。 3)logs文件夹下日志。 4)work文件夹下日志。 5)Profiler工具。 调度与分区优化 1.小分区合并 频繁的过滤或者过滤掉的数据量过大就会产生问题,造成大量小分区的产生。Spark是每个数据分区都会分配一个任务执行,如果任务过多,则每个任务处理的数据量很小,会造成线程切换开销大,很多任务等待执行,并行度不高; 解决方式:可以采用RDD中重分区的函数进行数据紧缩,减少分区数,将小分区合并变为大分区。 通过coalesce函数来减少分区。这个函数会返回一个含有numPartitions数量个分区的新RDD,即将整个RDD重分区。 当分区由10000重分区到100时,由于前后两个阶段的分区是窄依赖的,所以不会产生Shuffle的操作。 但是如果分区数量急剧减少,如极端状况从10000重分区为一个分区时,就会造成一个问题:数据会分布到一个节点上进行计算,完全无法开掘集群并行计算的能力。为了规避这个问题,可以设置shuffle=true 由于Shuffle可以分隔Stage,这就保证了上一阶段Stage中的上游任务仍是10000个分区在并行计算。如果不加Shuffle

Golang源码探索(二) 协程的实现原理

旧街凉风 提交于 2019-12-06 15:38:37
https://www.cnblogs.com/zkweb/p/7815600.html Golang源码探索(二) 协程的实现原理 Golang最大的特色可以说是协程(goroutine)了, 协程让本来很复杂的异步编程变得简单, 让程序员不再需要面对回调地狱, 虽然现在引入了协程的语言越来越多, 但go中的协程仍然是实现的是最彻底的. 这篇文章将通过分析golang的源代码来讲解协程的实现原理. 这个系列分析的golang源代码是Google官方的实现的1.9.2版本, 不适用于其他版本和gccgo等其他实现, 运行环境是Ubuntu 16.04 LTS 64bit. 核心概念 要理解协程的实现, 首先需要了解go中的三个非常重要的概念, 它们分别是 G , M 和 P , 没有看过golang源代码的可能会对它们感到陌生, 这三项是协程最主要的组成部分, 它们在golang的源代码中无处不在. G (goroutine) G是goroutine的头文字, goroutine可以解释为受管理的轻量线程, goroutine使用 go 关键词创建. 举例来说, func main() { go other() } , 这段代码创建了两个goroutine, 一个是main, 另一个是other, 注意main本身也是一个goroutine. goroutine的新建, 休眠,

快速上手Gobject

百般思念 提交于 2019-12-06 14:54:11
What is G-object? — 很多人被灌输了这样一种概念:要写面向对象程序,那么就需要学习一种面向对象编程语言,例如C++、Java、C#等等,而C语言是用来编写结构化程序的。 — 事实上,面向对象只是一种编程思想,不是一种编程语言。换句话说,面向对象是一种游戏规则,它不是游戏。 — Gobject,亦称Glib对象系统,是一个程序库,它可以帮助我们使用C语言编写面向对象程序;它提供了一个通用的动态类型系统(GType)、一个基本类型的实现集(如整型、枚举等)、一个基本对象类型-Gobject、一个信号系统以及一个可扩展的参数/变量体系。 Why Bother to use Gobject ? — GObject告诉我们,使用C语言编写程序时,可以运用面向对象这种编程思想。 — Gobject系统提供了一个灵活的、可扩展的、并且容易映射到其他语言的面向对象的C语言框架。 — GObject的动态类型系统允许程序在运行时进行类型注册,它的最主要目的有两个: 1)使用面向对象的设计方法来编程。GObject仅依赖于 GLib 和 libc ,通过它可使用纯C语言设计一整套面向对象的软件模块。 2)多语言交互。在为已经使用 GObject框架写好的函数库建立多语言连结时,可以很容易对应到许多语言,包括C++、Java、Ruby、Python和.NET/Mono等

JNI 技巧

狂风中的少年 提交于 2019-12-06 08:28:04
JNI 是指 Java 本地层接口(Java Native Interface)。它为用 Java 语言编写的受控代码定义了一种与本地层代码(用 C/C++ 编写)交互的方式。它是厂商无关的,其支持从动态共享库加载代码,尽管有时笨重,但它仍是有效的。 如果你对它还不熟悉,可以阅读 JNI规范(Java Native Interface Specification) 来获得对它的更多了解,了解 JNI 如何工作以及它有哪些功能。规范中有些地方的说明,并不是特别的清晰简洁明了,因而接下来的一些内容也许有点用。 JavaVM 和 JNIEnv JNI 定义了两个关键的数据结构, JavaVM 和 JNIEnv 。它们都是指向函数表的指针。(在 C++ 版本中,它们是类,其中包含一个指向函数表的指针,及每个 JNI 函数对应一个的成员函数,这些成员函数则简单地调用函数表中的对应函数。) JavaVM 提供了“调用接口”函数,通过这些函数,可以创建和销毁一个 JavaVM。看一下 JavaVM 结构的定义就一目了然了: # if defined(__cplusplus) typedef _JavaVM JavaVM; # else typedef const struct JNIInvokeInterface* JavaVM; # endif /* * JNI invocation

JNI 实战全面解析

倖福魔咒の 提交于 2019-12-06 08:22:51
简介 项目决定移植一款C++开源项目到 Android 平台,开始对JNI深入研究。 JNI是什么? JNI( Java Native Interface)意为 Java 本地调用,它允许Java代码和其他语言写的代码进行交互,简单的说,一种在Java虚拟机控制下执行代码的标准机制。 NDK是什么? Android NDK(Native Development Kit )是一套工具集合,允许你用像C/C++语言那样实现应用程序的一部分。 为什么要用NDK? 1、安全性,java是半解释型语言,很容易被反汇编后拿到源代码文件,我们可以在重要的交互功能使用 C语言 代替。 2、效率,C语言比起java来说效率要高出很多。 JNI和NDK的区别? 从工具上说,NDK其实多了一个把.so和.apk打包的工具,而JNI开发并没有打包,只是把.so文件放到文件系统的特定位置。 从编译库说 , NDK开发C/C++只能能使用NDK自带的有限的头文件,而使用JNI则可以使用文件系统中带的头文件。 从编写方式说, 它们 一样。 详解 1、JNI 元素 1、JNI组织结构 JNI函数表的组成就像C++的虚函数表,虚拟机可以运行多张函数表。 JNI接口指针仅在当前线程中起作用,指针不能从一个线程进入另一个线程,但可以在不同的线程中调用本地方法。 2、原始数据 Jobject 对象 引用类型 Java类型