堆栈的比较

本文探讨了如何限制C++类在堆栈和堆上的分配。通过将`operator new`声明为私有,可以阻止在堆上的分配,但在栈上分配仍然可行。另外,通过设置析构函数为受保护和提供`destroy`方法,可以强制类在堆上分配。然而,这种方法并不能完全阻止栈分配,因为析构函数会被系统调用。文章还讨论了堆栈的优缺点,以及堆的实现和性能问题,包括分配和释放操作的速度、竞争和碎片。此外,建议通过减少堆操作、使用内联缓冲区和自定义分配高速缓存来优化性能。
摘要由CSDN通过智能技术生成

///q让一个类只能在栈上分配,不能在堆上分配

class foo {

private:

        void *operator new(size_t);    //声明成private应该是阻止对new的调用。

};

 

int main()

{

        foo f;

        foo *p = new foo;

 

        return 0;

}

/r让在栈上分配类的对象的企图再编译就不可能

/rr

IMO, generally it is impossible to do this withoutsupport from the OS or compilation environment, sinceit is difficult to determine whether the object ison the heap or not...

 

For some very special system, this is possible sinceyou can control the heap address/length for some embedded system, but we still do not have a general solution...

/rrr

  注视掉 foo *p = new foo;就可以通过了。

 

///q让一个类只能在堆上分配,不能在栈上分配

让类只能在堆上分配也可以

析构函数protected.

加个public成员函数destroy() {delete this;}

这样A *a=new A;

析构的时候a->destroy();

/r

析构函数是默认必须要被调用的

你这样做,programmer调用完destroy后,系统还是会调用析构函数

所以,我觉得不可能不让用户在栈上分配吧

/rr

destroy中已经调用了析构函数,并释放了内存

不用再调了,你写个程序试试

 
///sitg

1.采用set_new_handle 函数来处理内存万一分配不足的问题。

2.先分配一个大块,然后在已经分配的块里进行new

3.假使有n个相同的对象。则可以这样处理、

直接分配new [4000],用链表来存储这些对象,使用的时候从链表里取,表该节点标识正使用,如果不用了,直接标识为未使用,这样就会减少分配和释放的内存消耗。

 

谢谢sitg了,讲得如此详细。应该好好加油学习,不懂就问这些大牛。离开了tsinghua之后,就没有机会了多学习多找问题。

 





堆栈基本知识

(heap)和栈(stack)C/C++编程不可避免会碰到的两个基本概念。首先,这两个概念

都可以在讲数据结构的书中找到,他们都是基本的数据结构,虽然栈更为简单一些。

在具体的C/C++编程框架中,这两个概念并不是并行的。对底层机器代码的研究可以揭示,栈是机器系统提供的数据结构,而堆则是C/C++函数库提供的。

具体地说,现代计算机(串行执行机制),都直接在代码底层支持栈的数据结构。这体现在,有专门的寄存器指向栈所在的地址,有专门的机器指令完成数据入栈出栈的操作。

这种机制的特点是效率高,支持的数据有限,一般是整数,指针,浮点数等系统直接支

持的数据类型,并不直接支持其他的数据结构。

 

因为栈的这种特点,对栈的使用在程序中是非常频繁的。对子程序的调用就是直接利用栈完成的。机器的call指令里隐含了把返回地址推入栈,然后跳转至子程序地址的操作,而子程序中的ret指令则隐含从堆栈中弹出返回地址并跳转之的操作。C/C++中的自动变量是直接利用栈的例子,这也就是为什么当函数返回时,该函数的自动变量自动失效的原因。

 

和栈不同,堆的数据结构并不是由系统(无论是机器系统还是操作系统)支持的,而是由函数库提供的。基本的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值