C/C++函数调用栈的实现方法

本文实例讲述了C/C++函数调用栈的实现方法。可用于实现简单的脚本解释器。分享给大家供大家参考。具体实现方法如下:

头文件声明部分:

代码如下:

#pragma once
const int BUFFERSIZE = 1024;
const int growfactor = 2;
 
// this stack is used as call stack.
class TStack{
private:
size_t size;   // the stack length
size_t pos;    // the stack top position   
char *buffer;  // the buffer

private:
void push(void* D, size_t bytecount);  // the implementation of push
void* pop(size_t bytecount);   // the implementation of pop
public:
TStack(size_t _size = BUFFERSIZE, size_t _pos = 0);  // initialize
TStack(const TStack& o);  // copy
TStack& operator=(const TStack& o);  // assignment
void pushInt(int i) { push(&i, sizeof(int)); }  // push an int
void pushLong(long l) { push(&l, sizeof(long)); }  // push a long
void pushfloat(double f) { push(&f, sizeof(f));}  // push  a double
void pushPointer(void* p){ push(p, sizeof(p)); }
// int
int popInt() { return *(int *)pop(sizeof(int));}  // pop an int
long popLong() { return *(long *)pop(sizeof(long)); }  // pop an int   
double* popfloat() { return (double*)pop(sizeof(double)); }  // pop a double
void* popPointer() { return pop(sizeof(void*)) ; }
void clear() { pos = 0; } 
};

实现部分:

代码如下:

#include "stdafx.h"
#include "TStack.h"
#include "new.h"
 
void TStack::push( void* D, size_t bytecount )
{
// if memory is not enough
// if run under multithread envionment,
// a lock or critical section should be added
if (pos + bytecount > size)
{   
  size_t oldsize = size;
       size *= growfactor;  
  char *newbuffer = new char[size];
  memcpy(newbuffer, buffer, oldsize);
  delete buffer;
  buffer = newbuffer;   
}
memcpy(buffer+pos, D, bytecount);
pos += bytecount;
}
 
void* TStack::pop( size_t bytecount )
{
// need synchronization for multithread environment
pos -= bytecount;
return &buffer[pos];
}
 
TStack::TStack( size_t _size , size_t _pos )
:size(_size),
pos(_pos),
buffer(new char[size])
{
}
 
TStack::TStack( const TStack &O )
:size(O.size),
pos(O.pos)
{
   buffer = new char[size];
   if (buffer != NULL)
   {
  memcpy(buffer, O.buffer, size);
   }
}
 
TStack& TStack::operator=( const TStack& O )
{
if (this == &O)
 return *this;     
    this->size = O.size;
this->pos = O.pos;
 
if (buffer != NULL)
{
delete buffer;
}
    buffer = new char[this->size];
if (buffer != NULL)
{
      memcpy(buffer, O.buffer, this->size);
}
return *this;
}

希望本文所述对大家的C++程序设计有所帮助。

(0)

相关推荐

  • 基于C++内存分配、函数调用与返回值的深入分析

    在谈述函数调用和返回值问题之前,先来看看C++中内存分配的问题. C++编译器将计算机内存分为代码区和数据区,很显然,代码区就是存放程序代码,而数据区则是存放程序编译和执行过程出现的变量和常量.数据区又分为静态数据区.动态数据区,动态数据区包括堆区和栈区.以下是各个区的作用:(1)代码区:存放程序代码:(2)数据区a.静态数据区: 在编译器进行编译的时候就为该变量分配的内存,存放在这个区的数据在程序全部执行结束后系统自动释放,生命周期贯穿于整个程序执行过程.b.动态数据区:包括堆区和栈区堆区:这

  • C/C++函数调用的几种方式总结

    调用函数时,计算机常用栈来存储传递给函数的参数. 栈是一种先进后出的数据结构,栈有一个存储区.一个栈顶指针.栈顶指针指向堆栈中第一个可用的数据项(被称为栈顶).用户可以在栈顶上方向栈中加入数据,这个操作被称为压栈(Push),压栈以后,栈顶自动变成新加入数据项的位置,栈顶指针也随之修改.用户也可以从堆栈中取走栈顶,称为弹出栈(pop),弹出栈后,栈顶下的一个元素变成栈顶,栈顶指针随之修改.函数调用时,调用者依次把参数压栈,然后调用函数,函数被调用以后,在堆栈中取得数据,并进行计算.函数计算结束以

  • C++ 17转发一个函数调用的完美实现

    前言 本文主要给大家介绍了关于C++17转发一个函数调用的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 方法如下 首先你灵光一闪: #define WARP_CALL(fun, ...) fun(__VA_ARGS__) 不我们并不喜欢宏,扩展性太差了 template<class R, class T1, class T2, class T3> R warp_call(R(*fun)(T1, T2, T3), T1 a, T2 b, T3 c) { return

  • 深入C++中构造函数、拷贝构造函数、赋值操作符、析构函数的调用过程总结

    1 . 用同一个类的源对象构造一个目标对象时,会调用拷贝构造函数来构造目标对象,如果没有定义拷贝构造函数,将调用类的默认拷贝函数来构造目标对象.2 . 当一个函数的返回值为一个类的对象时,如果在调用函数中,没有定义一个对象来接收这个返回对象值,会用返回一个临时对象保存返回对象的值.在被调用函数结束时,这个临时对象被销毁.而当调用函数中有一个接受对象时,就将返回对象赋值给接收对象,这个返回对象在调用函数结束时调用析构函数.3. 当类有一个带有一个参数的构造函数时,可以用这个参数同类型的数据初始化这

  • C/C++函数调用栈的实现方法

    本文实例讲述了C/C++函数调用栈的实现方法.可用于实现简单的脚本解释器.分享给大家供大家参考.具体实现方法如下: 头文件声明部分: 复制代码 代码如下: #pragma once const int BUFFERSIZE = 1024; const int growfactor = 2;   // this stack is used as call stack. class TStack{ private: size_t size;   // the stack length size_t

  • java 实现链栈存储的方法

    如下所示: package com.learn.algorithm.linkStack; /** * 链栈实现 * @author Jiekun.Cui * @param <T> */ public class LinkStack<T> { private LinkStack<T>.Node<T> top = new Node<T>(); private int size=0; /** * 进栈 * @param t * @return ; */

  • JavaScipt中栈的实现方法

    接下来就是数据结构的第一部分,栈. 栈是一种遵从后进先出原则(LIFO,全称为Last In First Out)的有序集合.栈顶永远是最新的元素. 举个例子就是:栈就像放在箱子里的一叠书 你要拿下面的书先要把上面的书拿开.(当然,你不能先拿下面的书) 看图示也可明白. JavaScipt中栈的实现 首先,创建一个构造函数. /** * 栈的构造函数 */ function Stack() { // 用数组来模拟栈 var item = []; } 栈需要有如下的方法: push(element

  • 浅谈在linux kernel中打印函数调用的堆栈的方法

    在Linux内核调试中,经常用到的打印函数调用堆栈的方法非常简单,只需在需要查看堆栈的函数中加入: dump_stack(); 或 __backtrace(); 即可 dump_stack()在~/kernel/ lib/Dump_stack.c中定义 void dump_stack(void) { printk(KERN_NOTICE "This architecture does not implement dump_stack()/n"); } __backtrace()的定义在

  • 详解微信小程序的不同函数调用的几种方法

    一.调取参数 直接调取当前js中的方法, 调取参数that.bindViewTap(); 二.跳转页面 navigateTo: function () { wx.navigateTo({ url: '../page4/page4' }); }, 全局变量使用方法 a.js var app = getApp() Page({ data: { hex1: [], })} //设置全局变量 if (hex1 != null) { app.globalData.hex1 = hex1; } b.js 接

  • Python栈的实现方法示例【列表、单链表】

    本文实例讲述了Python栈的实现方法.分享给大家供大家参考,具体如下: Python实现栈 栈的数组实现:利用python列表方法 代码如下: # 列表实现栈,利用python列表方法 class listStack(object): def __init__(self): self.items = [] def is_empty(self): return self.items == 0 def size(self): return len(self.items) def top(self)

  • JVM内存结构:程序计数器、虚拟机栈、本地方法栈

    目录 一.JVM 入门介绍 JVM 定义 JVM 优势 JVM JRE JDK的比较 学习步骤 二.内存结构 整体架构 1.程序计数器(寄存器) 1.1 作用 1.2 特点 2.虚拟机栈 2.1 定义 2.2 演示 2.3 面试问题辨析 2.4 内存溢出 2.5 线程运行诊断 3.本地方法栈 4.总结 一.JVM 入门介绍 JVM 定义 Java Virtual Machine,JAVA程序的运行环境(JAVA二进制字节码的运行环境) JVM 优势 一次编写,到处运行 自动内存管理,垃圾回收机制

  • JS的函数调用栈stack size的计算方法

    如果你写了一个一直调用自身的死循环,那么恭喜你,很快就可以看到报错:Uncaught RangeError: Maximum call stack size exceeded.那么这个call stack size有多少呢? 1. 计算方法 如下的方法可以为你计算出你使用的JavaScript引擎可以支持多深的调用(由Ben Alman的一段代码获得灵感): function computeMaxCallStackSize() { try { return 1 + computeMaxCallS

  • javascript 函数调用的对象和方法

    如果你真正理解Javascript函数是如何调用工作的,那么就可以避免一些bug的发生: 首先让我们创建一个简单的函数,这个函数将在下文中使用,这个函数仅仅返回当前的this的值和两个提供的参数. 复制代码 代码如下: function makeArray(arg1, arg2){ return [ this, arg1, arg2 ]; } 调用这个函数非常的简单,我们需要做的仅仅是: 复制代码 代码如下: makeArray('one', 'two'); 返回值:=> [ window, '

  • 使用docker部署django技术栈项目的方法步骤

    随着Docker的普及成熟,已经逐渐成为部署项目的首选,今天来和大家分享下如何使用docker部署django技术栈项目. 我们这里说的Django技术栈为:python3.6.Django2.2.redis.mysql.celery.gunicorn和nginx.在实际的生产项目中,这些组件分布在集群的不同机器,如Nginx.redis和Mysql可能会有单独的团队或部门负责.涉及的部署架构和容器的编排会更为复杂,本文暂不去深究.本文主要介绍,如何使用 docker-compose 来编排这些

随机推荐