Chinaunix首页 | 论坛 | 博客
  • 博客访问: 987954
  • 博文数量: 158
  • 博客积分: 4380
  • 博客等级: 上校
  • 技术积分: 2367
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-21 10:45
文章分类

全部博文(158)

文章存档

2012年(158)

我的朋友

分类: C/C++

2012-11-15 10:48:05

// 感谢[迷迷糊糊]提供_alloca我知
// _alloca的功能是在栈上动态分配空间
// 在栈空间不足的情况下会产生SEH异常,需要__try保护
// 不能对同一段代码同时采用SEH异常机制和C++异常机制,因此我使用异常规格指明构造函数不抛出异常
// 以下是一个完整的演示


#include
#include
#include
#include
using namespace std;
#define EXCEPTION_STACK_OVERFLOW ((unsigned long)0xC00000FDL)

int main( void )
{
    struct Test
    {
        int i;
        Test()  throw() : i(1) { cout << "construct" << endl; }
        ~Test() throw()        { cout << "destruct"  << endl; }
        void print() throw()   { cout << i << endl; }
    };

    __try
    {
        Test& t1 = *new( _alloca( sizeof(Test) ) ) Test;
        t1.print();
        t1.~Test();
    }
    __except( EXCEPTION_STACK_OVERFLOW==GetExceptionCode() ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH )
    {
        cerr << "alloca fail.\n";
    }

    return 0;
}
阅读(1460) | 评论(9) | 转发(0) |
给主人留下些什么吧!~~

网友评论2012-11-15 10:51:05

cc
这个功能不是挺好的吗,在一个函数内部需要处理未知长度的数据的时候。性能肯定比malloc高啊。

网友评论2012-11-15 10:50:51

nosound
嗯,如果“这项技术非常适合这个需求”的话,那么与
Test t1;
t1.print();
这样相比,它有什么优势呢?

网友评论2012-11-15 10:50:37

周星星
阿荣 用的是反语,他不赞成使用不为人熟知的技术,但我不这样认为,我认为该使用什么样的技术不能从它为人熟知与否来决定,而应该从需求来决定,如果这项技术非常适合这个需求,那么就应该使用它,无论它是否生僻。

网友评论2012-11-15 10:50:25

竹叶
不明白阿荣为什么这么说?
# re: 使用_alloca的一个Demo 6/4/2004 10:08 PM 阿荣
应该尽量在项目中使用不为人熟知的技术

网友评论2012-11-15 10:50:06

辣子鸡丁
鲁迅说过,世上本没有路,走的人多了就成了路
在GCC上也有类似的扩展, _alloca,他可以直接作用于下面的代码

int i;
char str;

不过这些偏门的特性,即使是语言本身,在C++也是不值得提倡的