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

 更新时间:2014年10月30日 10:22:32   投稿:shichen2014  
这篇文章主要介绍了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++程序设计有所帮助。

相关文章

  • 人脸检测中AdaBoost算法详解

    人脸检测中AdaBoost算法详解

    这篇文章主要为大家详细介绍了人脸检测中AdaBoost算法的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • C语言实现爆炸展开的扫雷详解

    C语言实现爆炸展开的扫雷详解

    windows自带的游戏《扫雷》是陪伴了无数人的经典游戏,本文将利用C语言实现这一经典的游戏,文中的示例代码讲解详细,感兴趣的可以学习一下,这篇文章主要介绍了C语言实现爆炸展开的扫雷游戏
    2022-07-07
  • C/C++ 开发神器CLion使用入门超详细教程

    C/C++ 开发神器CLion使用入门超详细教程

    这篇文章主要介绍了C/C++ 开发神器CLion使用入门超详细教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • VC++实现的OpenGL线性渐变色绘制操作示例

    VC++实现的OpenGL线性渐变色绘制操作示例

    这篇文章主要介绍了VC++实现的OpenGL线性渐变色绘制操作,结合实例形式分析了VC++基于OpenGL进行图形绘制的相关操作技巧,需要的朋友可以参考下
    2017-07-07
  • C/C++中宏/Macro的深入讲解

    C/C++中宏/Macro的深入讲解

    这篇文章主要给大家介绍了关于C/C++中宏/Macro的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C/C++具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-06-06
  • C语言详细分析讲解关键字enum与sizeof及typedef的用法

    C语言详细分析讲解关键字enum与sizeof及typedef的用法

    在 C 语言中经常会见到 enum、sizeof、typedef,那么我们今天就来讲解下它们三个,enum是C语言中的一种自定义类型,它是一种枚举类型,sizeof是编译器的内置指示符,用于计算类型或变量所占内存打小,typedef用于给一个已经存在的数据类型重命名,本质上不能产生新的类型
    2022-04-04
  • 判断两颗二叉树是否相似的两种方法

    判断两颗二叉树是否相似的两种方法

    今天小编就为大家分享一篇关于判断两颗二叉树是否相似的两种方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • 基于C语言实现扫雷小游戏

    基于C语言实现扫雷小游戏

    这篇文章主要为大家详细介绍了基于C语言实现扫雷小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • C++快速排序的分析与优化详解

    C++快速排序的分析与优化详解

    这篇文章主要介绍了C++快速排序的分析与优化,非常经典的算法,分析也较为详尽,需要的朋友可以参考下
    2014-08-08
  • C语言 循环详解及简单代码示例

    C语言 循环详解及简单代码示例

    本文主要介绍C语言的循环知识,这里整理了循环的基础资料并附简单的代码示例详细讲解,有需要的小伙伴可以参考下
    2016-08-08

最新评论