堆栈

C++技术之一:C++类 _stdcall

試著忘記壹切 提交于 2020-03-12 09:30:09
一切从一个C++ 类库头文件开始,现在在做一个C++的项目,期间用到一个开源的界面库DUILib(类似MFC),这个东西还不错能很容易的写出漂亮的界面,比如QQ的界面,可以去下载下来研究研究,地址:http://code.google.com/p/duilib/ 废话不多说,我比较困扰的是UIWebBrowser.h这个头文件,虽然是C++写的,但里面包含太多大学C++课本以外的东西,第一遍看下来跟看天书一样,里面有很多的不惑,接下来我们一个一个解开。 首先看一下这个函数定义: virtual HERSULT STDMETHODCALLTYPE GetTypeInfoCount( __RPC__out UINT *pctinfo); 这一篇详细介绍 __stdcall 上篇文章我们知道 #define STDMETHODCALLTYPE __stdcall ,那__stdcall又是个什么东东呢,有什么作用呢?下面来完全的了解一下. 1. _cdecl (1). 是C Declaration的缩写,表示C语言默认的函数调用方法,实际上也是C++的默认的函 数调用方法。 (2). 所有参数从右到左依次入栈,这些参数由调用者清除,称为手动清栈。具体所示:调用 方的函数调用->被调用函数的执行->被调用函数的结果返回->调用方清除调整堆栈。 (3). 被调用函数无需要求调用者传递多少参数

Java用链表实现堆栈

荒凉一梦 提交于 2020-03-11 17:10:00
定义 一种线性的存储结构,实现先进后出的原则,用链表实现的时候只能从头节点开始才能实现完整的铺上,pop,peap的完整操作,不同于数组的实现,链表不需要判断栈不否满了,只需要判断是否为空。 入栈:在头指针后面插入数据; 出栈:把头指针后一位的数据输出; 链表的定义 package com.jiedada.jiegou; public class Node1 { private Object data; private Node1 next; public Node1() { this.data=null; this.next=null; } public Node1(Object data) { this.data=data; this.next=null; } public Object getData() { return data; } public void setData(Object data) { this.data = data; } public Node1 getNext() { return next; } public void setNext(Node1 next) { this.next = next; } } View Code 链表的实现方法 package com.jiedada.jiegou; public class Link { Node1

每天一个好用的 Python 库:pretty-errors 让你的 Bug 看起来与众不同

99封情书 提交于 2020-03-09 21:50:36
首发于个人公.众.号:Python编程时光,转载请私信 当我们写的一个脚本或程序发生各种不可预知的异常时,如果我们没有进行捕获处理的时候,通常都会致使程序崩溃退出,并且会在终端打印出一堆 密密麻麻 的 traceback 堆栈信息来告诉我们,是哪个地方出了问题。 就像这样子,天呐,密集恐惧症要犯了都 上面这段 traceback 只有黑白两个颜色,无法像代码高亮那样,对肉眼实现太不友好了 无法直接显示报错的代码,排查问题慢人一步,效率太低 那有没有一种办法,可以解决这些问题呢? 当然有了,在 Python 中,没有什么问题是一个库解决不了的,如果有,那就等你去开发这个库。 今天要介绍的这个库呢,叫做 pretty-errors ,从名字上就可以知道它的用途,是用来美化错误信息的。 通过这条命令你可以安装它 $ python3 -m pip install pretty-errors 1. 环境要求 由于使用了 pretty-errors 后,你的 traceback 信息输出,会有代码高亮那样的效果,因此当你在使用测试使用 pretty-error 时,请确保你使用的终端可以输出带有颜色的字体。 在 windows 上你可以使用 Powershell,cmder 等 在 Mac 上你可以使用自带的终端,或者安装一个更好用的 iTerm2 2. 效果对比 随便写一个没有使用

每天一个好用的 Python 库:pretty-errors 让你的 Bug 看起来与众不同

让人想犯罪 __ 提交于 2020-03-09 20:02:06
首发于个人公.众.号:Python编程时光,转载请私信 当我们写的一个脚本或程序发生各种不可预知的异常时,如果我们没有进行捕获处理的时候,通常都会致使程序崩溃退出,并且会在终端打印出一堆 密密麻麻 的 traceback 堆栈信息来告诉我们,是哪个地方出了问题。 就像这样子,天呐,密集恐惧症要犯了都 上面这段 traceback 只有黑白两个颜色,无法像代码高亮那样,对肉眼实现太不友好了 无法直接显示报错的代码,排查问题慢人一步,效率太低 那有没有一种办法,可以解决这些问题呢? 当然有了,在 Python 中,没有什么问题是一个库解决不了的,如果有,那就等你去开发这个库。 今天要介绍的这个库呢,叫做 pretty-errors ,从名字上就可以知道它的用途,是用来美化错误信息的。 通过这条命令你可以安装它 $ python3 -m pip install pretty-errors 1. 环境要求 由于使用了 pretty-errors 后,你的 traceback 信息输出,会有代码高亮那样的效果,因此当你在使用测试使用 pretty-error 时,请确保你使用的终端可以输出带有颜色的字体。 在 windows 上你可以使用 Powershell,cmder 等 在 Mac 上你可以使用自带的终端,或者安装一个更好用的 iTerm2 2. 效果对比 随便写一个没有使用

[译]聊聊C#中的泛型的使用(新手勿入)

喜欢而已 提交于 2020-03-09 07:50:22
写在前面 今天忙里偷闲在浏览外文的时候看到一篇讲C#中泛型的使用的文章,因此加上本人的理解以及四级没过的英语水平斗胆给大伙进行了翻译,当然在翻译的过程中发现了一些问题,因此也进行了纠正,当然,原文的地址我放在最下面,如果你的英文水平比较好的话,可以直接直接阅读全文。同时最近建了一个.NET Core实战项目交流群637326624,有兴趣的朋友可以来相互交流。目前.NET Core实战项目之CMS的教程也已经更新了6篇了,目前两到三天更新一篇。 作者:依乐祝 原文地址: https://www.cnblogs.com/yilezhu/p/10029782.html 介绍 C#和.NET中的泛型程序具有强类型集合的许多优点,并为代码提供更高质量和性能提升。泛型是C#语言和公共语言运行库(CLR)中的一个新功能,它将类型参数的概念引入.NET Framework。类型参数使得设计某些类和方法成为可能,例如,通过使用泛型类型参数T,可以大大简化类型之间的强制转换或装箱操作的过程(装箱、拆箱问题)。说白了,泛型就是通过参数化类型来实现在同一份代码上操作多种数据类型,利用“参数化类型”将类型抽象化,从而实现灵活的复用。每个集合的详细规范可以在System.Collection.Generic名称空间下找到。 装箱和拆箱 .Net定义了两种主要的数据类型来表示变量

堆栈的详细讲解

不想你离开。 提交于 2020-03-09 04:57:02
在讲解堆栈之前,先让我们对堆栈有一个感性的认识 使用栈 :就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。 使用堆 :就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。 再了解一下堆栈的定义和函数调用的过程中堆栈的样子 记住堆栈定义中标黄的重点,对理清函数调用过程帮助非常大。 堆栈的定义 :堆栈是一种数据结构,具体是一个特定的存储区或寄存器。堆栈都是一种数据项按序排列的数据结构。 只能在一端(称为栈顶(top))对数据项进行插入和删除,也就是它的一端是固定的,另一端(栈顶)是浮动的 ,严格按照“先进后出”的原则存取,位于其中间的元素,必须在其栈上部(后进栈者)诸元素逐个移出后才能取出。 因而栈顶地址总是小于等于栈的基地址。 #include <stdio.h> void __stdcall func(int param1,int param2,int param3) { int var1=param1; int var2=param2; int var3=param3; printf("0x%08x\n",param1); //打印出各个变量的内存地址 printf("0x%08x\n",param2); printf("0x%08x\n\n"

java内存分析【精辟】

感情迁移 提交于 2020-03-08 16:08:31
在 JAVA 中,有六个不同的地方可以存储数据: 1. 寄存器( register )。这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部。但是寄存器的数量极其有限,所以寄存器由编译器根据需求进行分配。你不能直接控制,也不能在程序中感觉到寄存器存在的任何迹象。 2. 堆栈( stack )。位于通用 RAM 中,但通过它的“堆栈指针”可以从处理器哪里获得支持。堆栈指针若向下移动,则分配新的内存;若向上移动,则释放那些内存。这是一种快速有效的分配存储方法,仅次于寄存器。创建程序时候, JAVA 编译器必须知道存储在堆栈内所有数据的确切大小和生命周期,因为它必须生成相应的代码,以便上下移动堆栈指针。这一约束限制了程序的灵活性,所以虽然某些 JAVA 数据存储在堆栈中——特别是对象引用,但是 JAVA 对象不存储其中。 3. 堆( heap )。一种通用性的内存池(也存在于 RAM 中),用于存放所以的 JAVA 对象。堆不同于堆栈的好处是:编译器不需要知道要从堆里分配多少存储区域,也不必知道存储的数据在堆里存活多长时间。因此,在堆里分配存储有很大的灵活性。当你需要创建一个对象的时候,只需要 new 写一行简单的代码,当执行这行代码时,会自动在堆里进行存储分配。当然,为这种灵活性必须要付出相应的代码。用堆进行存储分配比用堆栈进行存储存储需要更多的时间。 4. 静态存储(

堆栈简析

て烟熏妆下的殇ゞ 提交于 2020-03-08 14:46:34
   (如果感觉有帮助,请帮忙点推荐,添加关注,谢谢!你的支持是我不断更新文章的动力。本博客会逐步推出一系列的关于大型网站架构、分布式应用、设计模式、架构模式等方面的系列文章) 数据类型   Java 虚拟机中,数据类型可以分为两类: 基本类型 和 引用类型 。    基本类型的变量保存原始值,即:它代表的值就是数值本身;   而引用类型的变量保存引用值。 “ 引用值 ” 代表了某个对象的引用,而不是对象本身,对象本身存放在这个引用值所表示的地址的位置。   基本类型包括: byte,short,int,long,char,float,double,Boolean,returnAddress   引用类型包括:类类型、接口类型和数组。 堆与栈    堆和栈是程序运行的关键,很有必要把他们的关系说清楚。   (1) 堆是存储的单位,栈是运行时的单位   (2) 堆解决的是数据存储的问题,即数据怎么放、放在哪儿;    栈解决程序的运行问题,即程序如何执行,或者说如何处理数据。     在 Java 中 一个线程就会相应有一个线程栈与之对应 ,这点很容易理解,因为不同的线程执行逻辑有所不同,因此需要一个独立的线程栈。     而 堆则是所有线程共享的 。栈因为是运行单位,因此里面存储的信息都是跟当前线程(或程序)相关信息的。包括局部变量、程序运行状态、方法返回值等等

堆”,\"栈\",\"堆栈\",\"队列\"以及它们的区别

烂漫一生 提交于 2020-03-08 14:32:10
如果你学过数据结构,就一定会遇到“堆”,"栈","堆栈","队列",而最关键的是这些到底是什么意思?最关键的是即使你去面试,这些都还会问到,所以如果你不懂对你是损失很大的。 堆:什么是堆?又该怎么理解呢? ①堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质: ·堆中某个节点的值总是不大于或不小于其父节点的值; ·堆总是一棵完全二叉树。 将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。常见的堆有二叉堆、斐波那契堆等。 ②堆是在程序运行时,而不是在程序编译时,申请某个大小的内存空间。即动态分配内存,对其访问和对一般内存的访问没有区别。 ③堆是应用程序在运行的时候请求操作系统分配给自己内存,一般是申请/给予的过程。 ④ 堆是指程序运行时申请的动态内存,而栈只是指一种使用堆的方法(即先进后出)。 栈:什么是栈?又该怎么理解呢? ①栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。 ②栈就是一个桶,后放进去的先拿出来,它下面本来有的东西要等它出来之后才能出来(先进后出) ③栈(Stack)是操作系统在建立某个进程时或者线程(在支持多线程的操作系统中是线程)为这个线程建立的存储区域,该区域具有FILO(先进后出)的特性,在编译的时候可以指定需要的Stack的大小。 堆栈

Java中堆内存和栈内存详解

删除回忆录丶 提交于 2020-03-08 12:59:23
Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用。 堆内存用于存放由new创建的对象和数组 。在堆中分配的内存,由java虚拟机自动垃圾回收器来管理。在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量的取值等于数组或者对象在堆内存中的首地址,在栈中的这个特殊的变量就变成了数组或者对象的引用变量,以后就可以在程序中使用栈内存中的引用变量来访问堆中的数组或者对象,引用变量相当于为数组或者对象起的一个别名,或者代号。引用变量是普通变量,定义时在栈中分配内存,引用变量在程序运行到作用域外释放。而数组&对象本身在堆中分配,即使程序运行到使用new产生数组和对象的语句所在地代码块之外,数组和对象本身占用的堆内存也不会被释放, 数组和对象在没有引用变量指向它的时候,才变成垃圾,不能再被使用,但是仍然占着内存,在随后的一个不确定的时间被垃圾回收器释放掉。这个也是java比较占内存的主要原因, 实际上,栈中的变量指向堆内存中的变量,这就是 Java 中的指针! java中内存分配策略及堆和栈的比较    1 内存分配策略