堆栈

YACC (Yet Another Compiler Compiler)

走远了吗. 提交于 2019-12-20 00:38:15
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> yacc(Yet Another Compiler Compiler) 是Unix/Linux上一个用来生成 编译器 的编译器(编译器代码生成器)。yacc生成的编译器主要是用C语言写成的语法解析器(Parser),需要与词法解析器Lex一起使用,再把两部份产生出来的C程序一并编译。yacc本来只在Unix系统上才有,但现时已普遍移植往Windows及其他平台。 分析程序生成器(parser generator)是一个指定某个格式中的一种语言的语法作为它的输入,并为该种语言产生分析过程以作为它的输出的程序。在历史上,分析程序生成器被称作编译-编译程序( compiler- compiler ),这是由于按照规律可将所有的编译步骤作为包含在分析程序中的动作来执行。现在的观点是将分析程序仅考虑为编译处理的一个部分,所以这个术语也就有些过时了。合并 LALR(1) 分析算法是一种常用的分析生成器,它被称作 Yacc( yet another compiler- compiler )。给出 Yacc 的概貌来,将使用Yacc为 TINY 语言开发一个分析程序。   作为 Yacc 对说明文件中的 %token NUMBER 声明的对应。Yacc 坚持定义所有的符号记号本身,而不是从别的地方引入一个定义

C#中值类型和引用类型

廉价感情. 提交于 2019-12-19 11:39:15
概念: 1.值类型:数据存储在内存的堆栈中,从堆栈中可以快速地访问这些数据,因此,值类型表示实际的数据。 2.引用类型:表示指向存储在内存堆中的数据的 指针或引用 (包括类、接口、数组和字符串)。 C#中定义的值类型包括原类型( Sbyte、Byte、Short、Ushort、Int、Uint、Long、Ulong、Char、Float、Double、Bool、Decimal )、枚举( enum )、结构( struct) 引用类型包括:类、数组、接口、委托、字符串等。 区别: 基本区别在于它们在内存中的 存储方式 。 值类型 只将值存放在内存中,这些值类型都存储在堆栈中。原始数据类型(如bool和int)都属于此类型。而 引用类型 的内存单元中只存放内存堆中对象的地址,而对象本身放在内存堆中。如果引用的值类型的值是null,则表示未引用任何对象。 堆和堆栈区别 : 堆和堆栈是两个不同的概念,在内存中的存储位置也不相同, 堆一般用于存储可变长度的数据,如字符串类型; 堆栈则用于存储固定长度的数据,如整型类型的数据int(每个int变量占用四个字节)。由数据存储的位置可以得知,当把一个值变量赋给另一个值变量时,会在堆栈中保存两个完全相同的值;而把一个引用变量赋给另一个引用变量,则会在堆栈中保存对同一个堆位置的两个引用,即在堆栈中保存的是同一个堆的地址。在进行数据操作时,对于值类型

进程的虚拟地址空间,堆栈、堆、数据段、代码段

微笑、不失礼 提交于 2019-12-18 15:02:40
上图是进程的虚拟地址空间示意图。 堆栈段:   1. 为函数内部的局部变量提供存储空间。   2. 进行函数调用时,存储“过程活动记录”。   3. 用作暂时存储区。如计算一个很长的算术表达式时,可以将部分计算结果压入堆栈。 数据段(静态存储区):   包括BSS段的数据段,BSS段存储未初始化的全局变量、静态变量。数据段存储经过初始化的全局和静态变量。 代码段:   又称为文本段。存储可执行文件的指令。 堆:   就像堆栈段能够根据需要自动增长一样,数据段也有一个对象,用于完成这项工作,这就是堆(heap)。堆区域用来动态分配的存储,也就是用 malloc 函数活的的内存。calloc和realloc和malloc类似。前者返回指针的之前把分配好的内存内容都清空为零。后者改变一个指针所指向的内存块的大小,可以扩大和缩小,他经常把内存拷贝到别的地方然后将新地址返回。 1、栈区(stack):由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap):由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。 3、全局区(静态区):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。

C++堆栈知识点

烈酒焚心 提交于 2019-12-18 09:45:23
一、栈和堆的区别。 1、申请方式的不同。栈由系统自动分配,堆由程序员使用new(关键字)或malloc(库函数)申请开辟; 2、申请大小的不同。栈获得的空间较小,windows系统里面栈的大小是2M,在linux系统里面栈的大小是8M,而堆获得的空间较大; 3、申请效率的不同。栈分配速度较快,但堆速度比较慢。因为系统用链表实现空闲地址空间的,所以堆的内存空间不连续的(链表的遍历效率低下)。 4、底层不同。栈是连续的空间,而堆是不连续的空间,容易产生内存碎片,不易管理,但使用方便。 二、栈溢出及解决方法。 栈溢出: 全局变量/局部静态变量存储于堆内存,堆区体积较大,一般不会溢出; 栈容量很小,一般也就一两兆,出现死循环或者大量的递归调用,很容易造成栈溢出。 栈溢出的解决方法: ①、谨慎使用递归调用。 ②、函数传参对象为大型聚合对象,尽量使用引用或指针。 ③、将减少栈空间的需求,堆空间分配内存。 例如: 栈溢出: # include <iostream> using namespace std ; int main ( ) { //栈溢出示例: const int nMax = 2 * 1024 * 512 ; char arr [ nMax ] { } ; cin . get ( ) ; return 0 ; } 对象放在堆区就没问题: # include <iostream>

tomcat错误This is very likely to create a memory leak

倖福魔咒の 提交于 2019-12-18 07:53:44
现象:最近时间出现了两次tomcat无法响应,重启就恢复正常。经查看日志,有几处可疑点。 下面是查找此问题用到的工具和方法和大家共享。 阿里云centos目前安装的是openjdk,先执行whereis java查看目录,找到bin文件java.exe同个目录发现没有,安装openjdk-devel 执行yum install java-1.7.0-openjdk-devel,安装后java文件夹有调试工具。安装运行jmap出错 Caused by: java.lang.RuntimeException: unknown CollectedHeap type : class sun.jvm.hotspot.gc_interface.CollectedHeap 这个是需要下载 openjdk-debuginfo包 https://www.rpmfind.net/linux/rpm2html/search.php?query=java-1.8.0-openjdk-debuginfo,安装包安装后还是出现的话,一般是版本不一致导致的。 jdk工具之jps jps主要用来输出JVM中运行的进程状态信息 jdk工具之jstack jstack主要用来查看某个Java进程内的线程堆栈信息。jstack可以定位到线程堆栈,根据堆栈信息我们可以定位到具体代码,所以它在JVM性能调优中使用得非常多。

计算几何-经典算法-凸包

本小妞迷上赌 提交于 2019-12-17 21:28:07
  在学习了一些有关计算机几何的基础知识和一些基本工具之后要快速的解决一些简单的几何问题,如两点之间的距离、两线段的交点个数等等是可以轻松应付的,但是对于复杂点的几何问题,我们还是要有更好的算法,这样才可以更高效的解决它。在这一篇中来总结 平面凸包 的 Graham算法; http://www.cnblogs.com/jbelial/ 平面凸包 : 定义: 对一个简单多边形来说,如果给定其边界上或内部的任意两个点,连接这两个点的线段上的所有点都被包含在该多边形的边界上或内部的话,则该多边形为凸多边形 。 在解决平面凸包下面介绍了两种算法: 一、 Graham 扫描法,运行时间为 O(nlgn) 。 二、 Jarvis 步进法,运行时间为 O(nh),h 为凸包中的顶点数。 例题 1 1 问题描述1: 2 求覆盖平面上n 个点的最小的凸多边形。也可以这样描述:给定一个连接的多边形,可能是凸多边形,也有可能是凹多边形。现在,你的任务就是编程求这个多边形的最小凸包。如果它本身是凸多边形,那么最小凸包就是它本身。 3 数据范围: 4 多边形顶点坐标X,Y 是非负整数,不超过512。 5 输入: 6 共有K 组数据,每组测试数据的点都是按逆时针顺序输入的,没有3 个点共线。 7 每组测试数据的第1 行是N,表示有N 个点。以下N 行,每行两个整数X,Y。 8 输出: 9

JS堆栈

筅森魡賤 提交于 2019-12-17 19:37:18
堆&栈 堆是堆内存(heap)的简称,栈是栈内存(stack)的简称。 javascript的基本类型都是直接按值存储在栈中的,每种类型的数据占用的内存空间的大小是确定的,并由系统自动分配和自动释放。这样带来的好处就是,内存可以及时得到回收,相对于堆来说,更加容易管理内存空间。 javascript中其他类型的数据被称为引用类型的数据 : 如对象(Object)、数组(Array)、函数(Function) …,它们是通过拷贝和new出来的,这样的数据存储于堆中。其实,说存储于堆中,也不太准确,因为,引用类型的数据的地址指针是存储于栈中的,当我们想要访问引用类型的值的时候,需要先从栈中获得对象的地址指针,然后,再通过地址指针找到堆中的所需要的数据。 栈中的基本数据类型 基本数据类型值指保存在栈内存中的简单数据段。访问方式是按值访问。 var name = ‘oralinge’ 更改name的值 name = 123 从1、2中我们可以看出,改变变量的值只操作变量实际保存的值,并不会开辟新的地址。 基本类型变量的复制 var b= name; 从一个变量向一个变量复制时,会在栈中创建一个新值,然后把值复制到为新变量分配的位置上。 更改变量b的值 b = ‘oralinge’ 堆中的引用数据类型 引用数据类型值指保存在堆内存中的对象。也就是,变量中保存的实际上的只是一个指针

Java 集合框架之Collection

喜欢而已 提交于 2019-12-17 04:23:53
     此图是 java 中 Collection 相关的接口与类的关系的类图。其中,类只是集合框架的一部分,比较常用的一部分。   第一次画类图,着实很费劲,不过收获也不小。   下面是相关接口和类的解释说明。文字来自 JDK API 1.6 中文版。原谅我的懒惰,实在不想自己写,太麻烦。如有错误,还请指正。   如图,Set、Queue、List 接口都继承自 Collection 接口。    AbstractCollection<E>   此类提供 Collection 接口的骨干实现,以最大限度地减少了实现此接口所需的工作。   要实现一个不可修改的 collection,编程人员只需扩展此类,并提供 iterator 和 size 方法的实现。(iterator 方法返回的迭代器必须实现 hasNext 和 next。)   要实现可修改的 collection,编程人员必须另外重写此类的 add 方法(否则,会抛出 UnsupportedOperationException),iterator 方法返回的迭代器还必须另外实现其 remove 方法。   按照 Collection 接口规范中的建议,编程人员通常应提供一个 void (无参数)和 Collection 构造方法。    Set   一个不包含重复元素的 collection。更确切地讲,set

习题3.9 堆栈操作合法性 (20分)

元气小坏坏 提交于 2019-12-16 23:14:53
习题3.9 堆栈操作合法性 (20分) AC代码 # include <iostream> # include <cstdio> # include <stack> # include <queue> # include <map> # include <cstring> # include <vector> # include <algorithm> # include <set> using namespace std ; int n , m , len ; char s [ 210 ] ; void solve ( ) { int cnt = 0 ; for ( int i = 0 ; i < len ; i ++ ) { if ( s [ i ] == 'S' ) cnt ++ ; else if ( s [ i ] == 'X' ) cnt -- ; if ( cnt > m || cnt < 0 ) { printf ( "NO\n" ) ; return ; } } if ( cnt != 0 ) { printf ( "NO\n" ) ; return ; } printf ( "YES\n" ) ; } int main ( ) { scanf ( "%d%d" , & n , & m ) ; for ( int i = 0 ; i < n ; i ++ ) {

C++软件崩溃调试

♀尐吖头ヾ 提交于 2019-12-16 06:29:59
当我们遇到程序崩溃时,如果没有非常详细的日志,很难找到原因。因此,我们可以尝试查看崩溃时的堆栈。 如果需要程序崩溃时产生堆栈记录,那么需要在注册表添加这三项内容。 添加注册表项 按下WIN+R打开运行窗口 输入regedit然后进入里面添加以下三项,那么在软件崩溃的时候就会产生dump文件了 增加仿真崩溃的代码 route::HWPoint* pns=NULL; pns->angle = 5; 双击打开程序,生成dump文件 调试dmp文件 双击打开dmp文件 关联代码 点击仅限本机进行调试 根据堆栈找到错误的原因 来源: CSDN 作者: 持之以恒2016 链接: https://blog.csdn.net/wei242425445/article/details/103473844