QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 679|回复: 10

[C++]两个问题……

[复制链接]
发表于 2004-7-13 17:21:06 | 显示全部楼层 |阅读模式
1.我在看游戏编程的文章的时候,经常看到文章里说得自己实现一个内存池。不知道为什么要自己做内存池……内存池和系统管理内存有什么区别吗?有这种必要吗??

2.在有多重派生的类结构中,某个基类在构建函数里调用this得到的是否是整个完整对象的首地址?还是那个基类数据区的首地址??
发表于 2004-7-13 20:22:04 | 显示全部楼层
1。我猜测,是否内存池是用来存放常用数据的,比如,全局的图形,音乐, 这样可以加快游戏速度,不用频繁的读取文件,如果内存池真是这个目的,当然是有必要的了

2。我猜测,是对象首地址,一般来说,类如果不实例化,只是一种类型,而取这个类型的首地址好像是没有多大意义的

呵呵,只是我的猜测
回复

使用道具 举报

发表于 2004-7-14 08:38:52 | 显示全部楼层
2 我也猜测是整个对象的首地址,否则怎样通过this来调用自己的成员函数
回复

使用道具 举报

发表于 2004-7-14 15:01:33 | 显示全部楼层
1.A memory pool is an abstract representation of a chunk of memory allocated for use by a program. Rather than requesting memory directly from the OS不知这个池和你那个池是否一个概念
2.我觉得《深度探索C++对象模型》p131有几页讲得很好,不过我自己又看得似懂非懂,所以就请楼主自己看看啦(况且这本书适合楼主这种对c++深入研究的人看 )。
回复

使用道具 举报

发表于 2004-7-14 22:53:17 | 显示全部楼层

Re: [C++]两个问题……

[quote:90ce8fc2e0="sjinny"]1.我在看游戏编程的文章的时候,经常看到文章里说得自己实现一个内存池。不知道为什么要自己做内存池……内存池和系统管理内存有什么区别吗?有这种必要吗??

2.在有多重派生的类结构中,某个基类在构建函数里调用this得到的是否是整个完整对象的首地址?还是那个基类数据区的首地址??[/quote]

1.malloc是很重的操作,如果频繁调用很费时间(翻一眼经典的PHK malloc源码你就知道了)。
2.this不要把看当成指针用,它的意义是由你的编译器决定的。
回复

使用道具 举报

 楼主| 发表于 2004-7-15 01:11:52 | 显示全部楼层
1.
A memory pool is an abstract representation of a chunk of memory allocated for use by a program. Rather than requesting memory directly from the OS

和我说的内存池是一个概念,不过这个内存池也要实现申请、释放等功能,我觉得和系统提供的是一样的啊……我还在一篇文章里看到人说要用分页方式来实现内存池……我心想干嘛要自己去完成操作系统的任务呢?

2.this……是个关键字还是个指针?
我的印象中似乎创建一个派生类的实例的时候,调用顺序是先调用派生类的构建函数,然后是基类的构建函数……;而执行顺序则是先执行基类的构建函数,然后才是派生类的……这样我就想:new的执行过程中对空间的申请是怎么完成的呢?this的值是什么时候确定的呢?如果在基类构建函数被调用时或被调用前空间申请就已经完成,并且此时也完成了this的赋值,那么基类里得到的就应该是整个对象的首地址……但是似乎可能也和编译器有关……

《深度探索C++对象模型》和PHK malloc源码偶都没有哦……
回复

使用道具 举报

发表于 2004-7-15 10:37:49 | 显示全部楼层
[quote:c26653bbdc="sjinny"]1.
A memory pool is an abstract representation of a chunk of memory allocated for use by a program. Rather than requesting memory directly from the OS

和我说的内存池是一个概念,不过这个内存池也要实现申请、释放等功能,我觉得和系统提供的是一样的啊……我还在一篇文章里看到人说要用分页方式来实现内存池……我心想干嘛要自己去完成操作系统的任务呢?

2.this……是个关键字还是个指针?
我的印象中似乎创建一个派生类的实例的时候,调用顺序是先调用派生类的构建函数,然后是基类的构建函数……;而执行顺序则是先执行基类的构建函数,然后才是派生类的……这样我就想:new的执行过程中对空间的申请是怎么完成的呢?this的值是什么时候确定的呢?如果在基类构建函数被调用时或被调用前空间申请就已经完成,并且此时也完成了this的赋值,那么基类里得到的就应该是整个对象的首地址……但是似乎可能也和编译器有关……

《深度探索C++对象模型》和PHK malloc源码偶都没有哦……[/quote]

看来楼主还是习惯用c的眼光看c++。
c++不是c,它虽然可以兼容c,但那是出于实用强加上去的。
所以,this只有逻辑意义,而没有物理意义。也就是说,它只是语法上看着像指针,但它不是c里的指针。

举个简单的c++实现的例子。

class fooclass{
public:
  void foo();
private:
  int foo1;
};

我写的编译器可能把它编译成这样
typedef (void*)(vptr*)(void*);
struct fooclass{
  vptr vptable;  
  int foo1;
}
int fooclass_foo(struct fooclass*);

这时候this指针就是个 struct fooclass*。因此,编译程序里需要对this与普通指针区别开来单独生成程序,所以它不是一般意义的指针。
回复

使用道具 举报

 楼主| 发表于 2004-7-15 18:05:47 | 显示全部楼层
  
难道昨晚的羊肉串降低了我的理解能力?一连两个帖子都没看懂……   
回复

使用道具 举报

发表于 2004-7-15 19:05:12 | 显示全部楼层
大热天吃羊肉容易上火
楼主熟不熟悉c++里的table-driven object model?这是c++里的类实现方式(应该说之一吧)。我觉得kakuyou说得很对,由于C++的具体实现不同,强求this的具体意义不太合适。但看看表驱动的对象模型对你的问题理解有帮助。
回复

使用道具 举报

 楼主| 发表于 2004-7-15 19:32:53 | 显示全部楼层
看来还得再学习学习……你们说的一些词我都没听过…… :neutral:
回复

使用道具 举报

 楼主| 发表于 2004-7-16 07:56:40 | 显示全部楼层
2.找到两篇文章,也许能说明调用this得到的就是首地址……
http://www.sunistudio.com/cppfaq/ctors.html#[10.7]
http://www.vckbase.com/document/viewdoc.asp?id=933
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-7 20:57 , Processed in 0.062884 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表