堆栈

转 C++面试题

我怕爱的太早我们不能终老 提交于 2019-11-28 05:18:51
1.static有什么用途?(请至少说明两种) 1)函数体内,声明为static的变量,在函数调用中其值不变。 2) 在同一个文件内(但在函数体外),声明为静态的变量,可被本文件内所有函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。 3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用 2.引用( &)与指针(*)有什么区别? 1) 引用必须被初始化,指针不必。 2) 引用初始化以后不能被改变,指针可以改变所指的对象。 3) 不存在指向空值的引用,但是存在指向空值的指针。 4) 引用没有 const,指针有 const,const 的指针不可变; 附:int &ra=a; //引用ra,是变量a的引用,即别名 & 在此不是求地址运算,而是起标识作用。 声明引用,必须同时对其初始化。 引用声明完,相当于变量有两个名称。 引用本身不占有存储单元 不能建立引用的引用,指向指针的引用(int && n ; int &*p 为错误的 int *&q;正确) 3.描述实时系统的基本特性 时间约束性 可预测性 可靠性 4.全局变量和局部变量在内存中是否有区别?如果有,是什么区别? 全局变量储存在静态数据库 局部变量在堆栈。 局部变量会屏蔽全局变量 全局变量运行时会更快(不用再分配空间) 5.什么是平衡二叉树?

HelenOS

蹲街弑〆低调 提交于 2019-11-28 04:57:03
HelenOS 来源 http://www.helenos.org/ 关于HELENOS HelenOS是一种基于便携式微内核的多服务器操作系统,从头开始设计和实现。 它将关键操作系统功能(如文件系统,网络,设备驱动程序和图形用户界面)分解为一系列细粒度的用户空间组件,这些组件通过消息传递相互交互。 一个组件的故障或崩溃不会直接损害其他组件。 因此,HelenOS具有灵活性,模块化,可扩展性,容错性和易于理解性。 HelenOS旨在与C11和C ++ 14标准兼容,但并不希望成为任何现有操作系统的克隆,并且与传统API交换兼容性以实现更清洁的设计。 大多数HelenOS组件都是专门为HelenOS订购的,因此其基本部件可以不受适配层(adaptation layers),胶水代码(glue code),法兰组件(franken components)和由此产生的维护负担的影响。 HelenOS运行在八种不同的处理器架构和机器上,从嵌入式ARM设备和单板计算机到多核32位和64位台式机,再到64位Itanium和SPARC机架式服务器。 HelenOS是开源的免费软件。 其源代码可在BSD许可下获得。 某些第三方组件是根据GPL许可的。 常见问题 基本概念 什么是微内核? 在微内核操作系统中,诸如设备驱动程序,文件系统和网络之类的某些功能从内核空间移出到用户空间。

【JVM】参数配置

女生的网名这么多〃 提交于 2019-11-28 03:43:41
【一】JVM参数配置释意 编号 配置项 例子 含义 备注 1 -Xmx -Xmx20m java应用最大可用内存为20M 整个JVM内存大小=年轻代大小 + 年老代大小 + 持久代大小 。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。 2 -Xms -Xms5m java应用最小分配内存为5M 3 -Xmn -Xmn1m 新生代配置的内存为1M 4 -XX:NewRatio -XX:NewRatio=3 新生代和年老代的内存分配比例为1:4 -XX:NewRatio=4 :设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)。设置为4,则年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5 5 -XX:SurvivorRatio -XX:SurvivorRatio=8 新生代内部Survivor和Eden区域的比例. 2Survivor:Eden=2:8 -XX:SurvivorRatio=4 :设置年轻代中Eden区与Survivor区的大小比值。设置为4,则两个Survivor区与一个Eden区的比值为2:4,一个Survivor区占整个年轻代的1/6 6 -Xss -Xss128k 设置每个线程的堆栈大小 JDK5.0以后每个线程堆栈大小为1M

Mozilla SpiderMonkey JavaScript 内核--命令参数

纵饮孤独 提交于 2019-11-28 03:08:06
命令行选项 -b 分支限制 设置 分支限制 -c 堆栈块大小 设置 堆栈块大小 -C 编译程序,并不运行。可以通过这中方式检测代码中的错误,而免去运行代码。 -e 脚本 运行声明的 脚本 , 脚本 必须是文字字符串(literal string) -f 文件名 运行文件中的JavaScript程序 -g 秒数 启动Shell后,休眠 秒数。 用于绑定debugger. -i 启用interactive模式 -j 启用跟踪(trace) JIT -m 启用方法(method) JIT -P 在文件的第一行写入"/usr/bin/env js -P",这样文件可以直接被 JavaScript 引擎解释/执行 注:适用于UNIX和Linux -s 堆栈大小 设置 堆栈大小 -v 版本号 设置使用指定版本号的JavaScript -w 启用警告(warnning)消息 -W 禁用警告(warnning)消息 -x 启用E4X XML 模式 转载于:https://www.cnblogs.com/ebread/archive/2011/07/07/2100127.html 来源: https://blog.csdn.net/weixin_30896763/article/details/99952271

从零写一个编译器(十一):代码生成之Java字节码基础

帅比萌擦擦* 提交于 2019-11-28 00:56:54
项目的完整代码在 C2j-Compiler 前言 第十一篇,终于要进入代码生成部分了,但是但是在此之前,因为我们要做的是C语言到字节码的编译,所以自然要了解一些字节码,但是由于C语言比较简单,所以只需要了解一些字节码基础 JVM的基本机制 JVM有一个执行环境叫做stack frame 这个环境有两个基本数据结构 执行堆栈:指令的执行,都会围绕这个堆栈来进行 局部变量数组,参数和局部变量就存储在这个数组。 还有一个PC指针,它指向下一条要执行的指令。 举一个例子 int f(int a, int b) { return a+b; } f(1,2); JVM的执行环境是这样变化的 stack: localarray:1,2 pc:把a从localarray取出放到stack stack:1 localarray:2 pc:把b从localarray取出放到stack stack:1,2 localarray: pc:把a,b弹出堆栈并且相加压入堆栈 对于JVM提供的对象 .class public CSourceToJava .super java/lang/Object .method public static main([Ljava/lang/String;)V getstatic java/lang/System/out Ljava/io/PrintStream; ldc

单片机的栈

与世无争的帅哥 提交于 2019-11-27 18:43:00
导读:在C语言的世界里,栈的地位非常举足轻重,许多错误都可能和栈设置有关,那么该如何确定栈的大小? 今天分享一点栈知识,帮助你确定栈的大小,参考链接请点击下方的阅读原文。 其实很多编译工具是可以获取函数调用信息的,比如: KEIL 平台 可以使用参数: --callgraph:生成一个静态调用图(html或文本格式),显示堆栈使用情况 --info=stack:列出所有全局符号的堆栈使用情况 以上两个参数分别生成Objects目录下的 xxx.htm文件(事实上这个--callgraph是默认参数,用浏览器打开这个文件即可)和 Listings目录下的xxx.map 文件(keil或者记事本打开)。 xxx.htm xxx.map 事实上这个文件生成也是由默认参数 --map 管理的,不同的是增加 --info=stack 参数后,文件中还会增加如下信息: 它描述了每一个函数调用情况,并且把最大调用链和最大使用栈给你找出来了(这个文件打开有一个小技巧,双击 Target 1,即可打开这个文件,方便快捷)。 事实上,这些信息只能用于参考,而不能作为最终的栈大小,计算实际栈大小远比这个复杂,这个原文进行了深入阐述。 事实上,一般设置栈大小都不会采用如此复杂的计算,而是通过长时间运行来简单确定栈大小(一般 RTOS 都有栈检查功能函数)

缓冲区溢出以及缓冲区溢出攻击

拜拜、爱过 提交于 2019-11-27 16:38:51
缓冲区溢出是指当计算机程序向缓冲区内填充的数据位数超过了缓冲区本身的容量。溢出的数据覆盖在合法数据上。理想情况是,程序检查数据长度并且不允许输入超过缓冲区长度的字符串。但是绝大多数程序都会假设数据长度总是与所分配的存储空间相匹配,这就为缓冲区溢出埋下隐患。 操作系统所使用的缓冲区又被称为堆栈,在各个操作进程之间,指令被临时存储在堆栈当中,堆栈也会出现缓冲区溢出。 当一个超长的数据进入到缓冲区时,超出部分就会被写入其他缓冲区,其他缓冲区存放的可能是数据、下一条指令的指针,或者是其他程序的输出内容,这些内容都被覆盖或者破坏掉。可见一小部分数据或者一套指令的溢出就可能导致一个程序或者操作系统崩溃。 #include <stdio.h> #include <string.h> #include <iostream> using namespace std; int main(int argc, char *argv[]) { char buf[10]; strcpy(buf, argv[1]); cout<<buf; return 0; } 连续输入20个字符就产生了溢出。 C语言常用的strcpy、sprintf、strcat 等函数都非常容易导致缓冲区溢出问题。 程序运行时,其内存里面一般都包含这些部分: (1)程序参数和程序环境; (2) 程序堆栈( 堆栈则比较特殊

缓冲区溢出攻击

耗尽温柔 提交于 2019-11-27 16:38:29
缓冲区溢出是目前最常见的一种安全问题,操作系统以及应用程序大都存在缓冲区溢出漏洞。缓冲区是一段连续内存空间,具有固定的长度。缓冲区溢出是由编程错误引起的,当程序向缓冲区内写入的数据超过了缓冲区的容量,就发生了缓冲区溢出,缓冲区之外的内存单元被程序“非法”修改。 一般情况下,缓冲区溢出导致应用程序的错误或者运行中止,但是,攻击者利用程序中的漏洞,精心设计出一段入侵程序代码,覆盖缓冲区之外的内存单元,这些程序代码就可以被CPU所执行,从而获取系统的控制权。 8.1 缓冲区溢出攻击原理 1. 局部变量与堆栈的关系 在一个程序中,会声明各种变量。静态全局变量是位于数据段并且在程序开始运行的时候被初始化,而局部变量则在堆栈中分配,只在该函数内部有效。 如果局部变量使用不当,会造成缓冲区溢出漏洞。例如,以下程序将命令行的第1个参数拷贝到buf局部变量中。 int main(int argc, char **argv) { char buf[80]; strcpy(buf, argv[1]); } 在一次函数调用中,堆栈中将被依次压入:参数、返回地址。如果函数有局部变量,接下来,就在堆栈中开辟相应的空间(SUB ESP,x)以构造变量。函数执行结束时,恢复堆栈到函数调用的地址,弹出返回地址到EIP以继续执行程序。 例如,调用函数main(int argc, char **argv)时

java中的堆栈问题

*爱你&永不变心* 提交于 2019-11-27 16:19:56
本篇博客是听尚学堂高淇老师讲课所做笔记,如需转载请注明出处! java虚拟机内存分为:堆(heap)、栈(stack)、方法区(method area) 栈 :方法执行的内存模型(属于线程私有,不属于线程共享) 特点:先进后出,后进先出(和子弹夹一样),栈存储局部变量。栈由系统自动分配,速度快!栈是一个连续的内存空间 堆 :存放创建好的对象和数组(数组也是对象)(new出来的对象存放在堆中) JVM中只有一个堆空间,它被所有线程共享 堆是一个不连续的内存空间,分配灵活,速度慢! 方法区 :(静态区) jvm只有一个方法区,被所有线程所共享 方法区其实也是堆,只是用于存储 类、常量 相关的信息 用来存放程序中永远是不变或者唯一的内容(类信息【class对象】、静态变量、字符串常量等) 构造器: 1、要通过new关键字调用 2、构造器虽然有返回值,但是不能定义返回值类型(返回值的类型肯定是本类),不能在构造器里使用return返回某个值 3、如果没有定义构造器,则编译器会自动定义一个无参的构造函数。如果已定义则编译器不会自动添加 4、 构造器的方法名必须和类名保持一致! 垃圾回收器 (GC) 回收过程:1.发现无用的对象 2.回收无用的对象 垃圾回收相关算法:1.引用计数法:堆中每个对象被引用一次,计数加1,被应用变量值变为null,计数减1,直到计数为0,则变成无用对象。优点

[汇编]汇编学习笔记(2):EBP寻址

徘徊边缘 提交于 2019-11-27 13:40:45
刚看到ESP寻址和EBP寻址,个人理解其实2个寻址都是差不多的,都是利用偏移量来获取参数,一个搞懂另一个也明白了。只要记住ESP寻址有缺陷就OK了,缺陷就是在函数中使用push后会导致ESP一直在变,不好计算传入参数的地址而已。多写写就能记住。 练习:写个3数相加的函数。在敲代码之前,先画张图,理清下思路: 1.第一张图完成了计算,并将结果存入EAX寄存器中。说明下,图中的X地址只是用于做标示的,管它是多少来着。图上最后一张框里的汇编代码写错了, 把ECX写成EBX了 ,害得后面写代码也写错了╮(﹀_﹀)╭,仔细调试才发现写错,截图截了好几次,好累。 2.第二张图完成了恢复工作,恢复堆栈平衡,ECX,EDX,EBP3个寄存器恢复之前缓存的值。 开始敲代码,代码就按照上面2张图写,ECX寄存器所存储的值为了方便观察改成了12345678: 第一张图只是记录初始值。 第2张图,执行完call指令,观察堆栈里的值和ESP寄存器 第3张图执行完函数中的push指令,缓存了3个寄存器的值,并将ESP寄存器的值赋给EBP寄存器 第4张图,执行完了加法,并得到结果6,函数主要的功能完成, 最后一张图,几个pop指令加上retn指令恢复了堆栈平衡,和寄存器之前存储的值。变化就是栈顶上面有使用过的地址,提醒自己局部变量需要初始化。 来源: https://blog.csdn.net