空类的大小(sizeof), placement new 操作符
来源:互联网 发布:淘宝违规售假 编辑:程序博客网 时间:2024/05/22 15:05
原文链接:http://blog.csdn.net/zhangxaochen/article/details/8032758
这里“空类”是在说什么都没有或者只包含了非虚函数的类。
以前只是有印象知道打印 sizeof(空类)会输出“1”,但是也不知为什么。今天偶然看到,说是:
“一个空类也要实例化,所谓类的实例化就是在内存中分配一块地址,每个实例在内存中都有独一无二的地址。同样空类也会被实例化,所以编译器会给空类隐含的添加一个字节,这样空类实例化之后就有了独一无二的地址了。所以空类的sizeof为1”
其余什么类的4字节对齐,虚表占用空间,子类继承了父类占用的空间,类内static不占类空间 就不再提。
另外,借了段代码,略作演示:
class Base{public:Base(){};virtual ~Base(){};void set_num(int num){a=num;}virtual int get_num(){return a;}private: int a; char *p;};class Derive:public Base{public:Derive():Base(){};~Derive(){}; virtual int get_num(){return d;}private:static int st; int d; char *p;char c;};int main(){ cout<<sizeof(Base)<<endl;cout<<sizeof(Derive)<<endl;return 0;}
输出:
12
24
==========================================================
2. placement new
以前学C++语法的时候没有接触过,最近看 box2d的源码的时候见识了这样的语法。
说白了就是 operator new 的一个重载、全局版本,与平常的new操作符的不同在于,placement new 指定一块内存位置,然后在这块内存上调用类的构造函数,划分内存。
所以placement new 接受两个参数,一个是指定的内存地址,另一个是类名,原型如下:
void *operator new( size_t, void *p ) throw() { return p; }
用法如下:
void* mem=malloc(sizeof(B));B* bb=new (mem) B;
乍一看 new B 中间插了一个括号,的确很别扭不过这样的用法的好处是避免了“动态分配内存时查找可用内存” 这个动作消耗的时间,所以说他
“placement new非常适合那些对时间要求比较高,长时间运行不希望被打断的应用程序”
box2d 中跟 placement new 相关的源码是这样的:
b2Fixture* b2Body::CreateFixture(const b2FixtureDef* def){ ...... b2BlockAllocator* allocator = &m_world->m_blockAllocator; void* memory = allocator->Allocate(sizeof(b2Fixture)); b2Fixture* fixture = new (memory) b2Fixture; .....}
可以看到 Allocate(sizeof(b2Fixture)) 函数就相当于 malloc,只不过 box2d 自己做了内存管理的工作。因为 物理引擎总是需要大量的浮点运算,因此也符合“时间要求较高,长时间运行不希望被打断”这一断言。
原文链接:http://blog.csdn.net/zhangxaochen/article/details/8032758
{{OVER}}
- 空类的大小(sizeof), placement new 操作符
- 空类的大小(sizeof), placement new 操作符
- placement new 操作符
- placement new 操作符
- placement new 操作符
- placement new 操作符
- placement new操作符
- C++ placement new操作符
- c++ placement new操作符的使用技巧
- C++中placement new操作符的使用
- sizeof() 类大小,空类大小
- sizeof() 类大小,空类大小
- sizeof() 类大小,空类大小
- sizeof() 类大小,空类大小
- sizeof()类大小,空类大小
- C++中placement new操作符
- C++中placement new操作符
- C++中placement new操作符
- mtk android vibration小结
- SSH2实现数据库和界面的分页
- 我的第一个c++上机报告
- 详细讲解在Spring中进行集成测试
- 我的C++之旅开启了
- 空类的大小(sizeof), placement new 操作符
- 专家调查显示:液晶电视坏眼超等离子电视
- 我的第一次
- Fedora5下构造内核树 .
- 讲述C++中调用Python脚本
- BASH命令和SHELL脚本总结(5)赋值篇
- Unicode UTF-8 Ansi 互转及MultiByteToWideChar和WideCharToMultiByte用法等编码相关
- 液晶DID、等离子显示器、DLP背投技术对比
- Velocity 模板引擎在复杂邮件业务中的简单举例