我有一个A类对象,我想将其分配在自定义堆栈对象上。为了做到这一点,我只需将堆栈指针移动与对象大小相同的字节数并返回其先前的值:
class A : public B {}; //B is from a precompiled library
class stack {
public:
stack(void): _top(&_storage[0]) {}
template <typename T>
inline T* push(void) {
T* ptr = static_cast<T*>(_top);
_top += sizeof(T);
return ptr;
}
//...
private:
char _storage[1024];
char* _top;
};
stack _stack;
int main(int argc, char** argv) {
A* a = _stack.push<A>(); //ignore the lack of a constructor call
return 0;
}
Visual C++提示我,static_cast无法将char*转换为A*。普通的C样式转换不会出现这个错误,但我更愿意更明确地避免使用动态转换(A继承自另一个类,但不参与vtable,因此没有)。在这种情况下,两者有什么区别吗?