读过<<深度探索C++对象模型>>的请进

femalelover 2006-12-21 12:28:45
问二个问题:

1, 第20页中有写到:
struct mumble* pmumbl = (struct mumble*)
malloc( sizeof(struct mumble) + strlen( string) +1);
我觉得这个 sizeof (struct memble) 好像可以不要啊?

2,在某页看到"引用也是通过一个4字节的指针来实现"...大意是这样吧, 这句也不好理解.

这是一本好书, 俺这次买了一本正版, 头一回. 以后有什么问题, 会陆续向大家请教.
...全文
471 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
shunan 2006-12-21
  • 打赏
  • 举报
回复
mark,也正在看
晨星 2006-12-21
  • 打赏
  • 举报
回复
既然"引用就是一个别名", 那 int &b = a; b是a的引用,为什么在操作b的时候, 不直接对a寻址, 而要使用一个指针呢?
========================
比如如果传递引用参数呢?
并不是所有的引用类型,被引用的目标都可以在编译时确定。需要在运行时确定的,当然就需要有种机制(至少有那么一块空间),能把它的目标的位置记下来,这除了用指针,还有啥更方便的?
femalelover 2006-12-21
  • 打赏
  • 举报
回复
俺是楼主, 还是有点疑问:

Q1, 考虑晨星老大和Jim_King_2000说的, 好像仍然至少是多出1个字节的, 如果mumble的数组不是用pc[1]而是用pc[N], 那浪费的空间应该更多了.

Q2, 既然"引用就是一个别名", 那 int &b = a; b是a的引用,为什么在操作b的时候, 不直接对a寻址, 而要使用一个指针呢?
Jim_King_2000 2006-12-21
  • 打赏
  • 举报
回复
楼主的第一个问题microsoft可是经常使用。COM里面和驱动程序里面经常会看到这样的东西。取USB的描述符就必须这么干。因为我们不知道描述符有多长,因此只能第一次取长度,然后第二次再分配空间取完整的描述符(描述符的第一个字节就是这个描述符的长度)。
至于第二个问题嘛,如果楼主了解硬件,就知道计算机硬件只有地址的概念,没有引用的概念。引用完全是一个逻辑上的概念。因此我们只能用地址的方法来实现引用了。
该书确实是好书,我正在研读中……
mdzhao 2006-12-21
  • 打赏
  • 举报
回复
mark
Could 2006-12-21
  • 打赏
  • 举报
回复
1、这个是c语言里面传递结构数据的一个常用的一个技巧。我用c用得不多,但这招我刚好用过。把字符串放在结构的最后一个字段,然后把整个内存地址传递过去。
2、没什么好说的。
晨星 2006-12-21
  • 打赏
  • 举报
回复
哦,不对,+1可以去掉,sizeof不可以去掉,被楼主搞糊涂了。
作者写出来的代码是不全的,但他前面却已经讲清楚了:char pc[1];只是struct的最后一个字段,而结构体还可能有别的字段,只是这里仅仅用注释“/* stuff */ ”代表了一下而已。
我之所以说+1可以去掉,是因为struct中已经有个1了,后面再有strlen(string)的长度就够了。

建议好书看原版,呵呵。
v2002750 2006-12-21
  • 打赏
  • 举报
回复
sizeof (struct memble)为什么可以不要呢,不大理解其中原因。
sizeof (struct memble)是结构体大小,strlen(string)+1是字符串大小。
taodm 2006-12-21
  • 打赏
  • 举报
回复
楼主自己计算strlen( string); strlen( string) + 1 ;sizeof(struct mumble) + strlen( string) +1各是多少,并且看它后面怎么用这个pmumbl的,向它里面拷贝了多少数据。
自己动手单步跟一下程序就知道了。
sjjf 2006-12-21
  • 打赏
  • 举报
回复
在存储上,引用和指针无异,不同的是施加在两者上的操作,
因此导致两者出现完全不同的含义,引用的存在不是为了提高程序的运行效率的,而是为了
提高开发效率,使用引用是为了给编译器增添一条获取原始定义的信息的途径,从而避免像
使用指针那样丢失了很多信息,编程者就不用花费更多的心思去考虑这些信息丢失和还原。

偶以前回过的一个帖子中,有对这两者的详细描述,似乎还附带汇编代码片断,不过找不到 :(
自己跟进去asm看看就知道。
(不要跟踪优化后的代码,有可能找不到引用的踪迹。)
femalelover 2006-12-21
  • 打赏
  • 举报
回复
回来想把这帖子结了的, 没想到这么多朋友来讨论, 就挂着吧, 看第二章时又有些迷惑了, 过两天看完了再开帖.
caocheng8230 2006-12-21
  • 打赏
  • 举报
回复
mark
fcuandy 2006-12-21
  • 打赏
  • 举报
回复
inside c++ object mode?
Xcoder 2006-12-21
  • 打赏
  • 举报
回复
一个都不能去掉啊,它是为struct本身和字符串配置足够的内存,当然要有sizeof (struct memble)了,+1是字符串末尾的'\0'
晨星 2006-12-21
  • 打赏
  • 举报
回复
楼上说的有道理。
int &b = a;
这种通常只在教材上出现得多。实际中引用类型多用做参数,返回值等。
lann64 2006-12-21
  • 打赏
  • 举报
回复
既然"引用就是一个别名", 那 int &b = a; b是a的引用,为什么在操作b的时候, 不直接对a寻址, 而要使用一个指针呢?
---------------
如果对a直接使用那还需要引入“引用”吗?
引用是别名,但这个别名并不是“全等于”原来的变量,实现上不一样,const特征什么的也可以不一样。
Jedimaster 2006-12-21
  • 打赏
  • 举报
回复
我在递归函数中使用引用避免了Stack拷贝
不过引用的使用功能还是远远不如原始的指针,初学者特别容易产生疑惑
MS的COM没有用过引用
taodm 2006-12-21
  • 打赏
  • 举报
回复
C99正式引入的柔性数组成员,在此之前,所有编译都已经支持[]或者[0]中的至少一个
晨星 2006-12-21
  • 打赏
  • 举报
回复
类也可以有引用成员,在构造函数的参数列表中初始化,只是一般别这样用,不大方便。
femalelover 2006-12-21
  • 打赏
  • 举报
回复
嗯, 还是老大考虑问题全面. 事实上, 引用也常常是用来做参数的.
加载更多回复(3)

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧