C++与堆栈的讨论
1、栈中的多态
一般而言,C++的多态对象必须在堆中创建。若要在栈中创建,则派生类要定义扩展的数据成员就有些困难。这是由于任何C++对象必须具备一个静态的sizeof值以便管理堆栈框架。
但是,只要不在派生类中定义数据成员,要在栈中实现多态是可行的。关键在于sizeof算符和标准的C库函数memcpy。由于派生类没有定义扩展的数据成员,所以派生类和基类的唯一区别是派生类拥有不同的VTABLE指针。而这个VTABLE指针根据标准是应当包括在sizeof里面的。这样,我们可以对对象进行memcpy操作,将所有数据(包括VTABLE)替换成另一个对象的,即可修改对象的实际类型。
2、在栈中动态分配
堆栈一般是静态分配的,但它也具备动态的潜力。这是因为堆栈是可扩展的,尽管所做的扩展在退出当前函数的时候就消失了。
两种流行的编译器,VC++和G++分别提供了两种不同的堆栈动态分配方案。
VC++提供了库函数_alloc,用法跟标准库函数malloc一样,但它在栈中分配空间,所分配空间退出函数时自动释放,因此没有相对应的_free函数。
G++提供了“动态分配数组”的支持。例如:
void foo(int size)
{
char array[size];
...
}
可以在G++中利用动态分配数组定义出一个宏模拟_alloc的功能。但反过来就不好模拟了,因为这是语言上的扩充,而不仅仅是库函数的扩充。