看板CompBook
标 题C++ Object Model 答客问 (1)
发信站清华资讯(枫桥驿站) (Sat Mar 25 22:41:27 2000)
转信站Ptt!bbs.ee.ntu!freebsd.ntu!news.cs.nthu!maple
C++ Object Model 答客问 (1)
侯捷
[email protected]
2000.03.25 第一次发表於
清大.枫桥驿站(140.114.87.5).电脑书讯版(Computer/CompBook)
本文将於日後整理於 侯捷网站
侯捷网站:www.jjhou.com
----------------------------------------------------------------
FeiYu wrote (1999/12/29) :
> Dear Sir:
> 看了Inside C++ Object Model後,有几点想和你讨论:
>
> 1. 文中多次出现「内化」、「扩张」等词(尤其在constrctor)
> 中译本内中英对照表并未加以标注,建议你把他加进去,
> 因为这些字眼实在很少在其他书中看到。
>
> 2. p.26中的程式:
> void rotate (X datum,const X* pointer,const X& reference)
> {
> (*pointer).rotate ();
> reference.rotate ();
> datum.rotate ();
> } // end function
> 在VC中编译会出现转型上的错误,必须拿掉参数列const才可以执行。
>
> 3. p52.中间:
> ".....这情况下并不需要合成出一个default copy constructor,
> 因为上述宣告展现了"default copy semantics"........."
> 这段话应如何解释呢?怎样才算是default copy semantics?
> "bitwise copy semantics"?
>
> 4. p.74
> 里面提到 member initialization list 在四种情形下可以
> 被使用(即使没有用,也可以正确编译,只是会造成效率不彰),
> 但LIPPMAN没有说明为何会造成编译器对以两种不同方式设定初值,
> 会扩展成为不同的码,是因为编译器设计上某种无法避免的需要?
> 还是有其他的原因
>
> 5. LIPPMAN书中常常会列出「经过扩展、内化」或是「转换」
> 过的原始码,藉由观察这些码,可以明显发现编译器暗中动了
> 哪些手脚,但这似乎是本书独有的特色,一般编译器多提供
> 机器码的对应,而不会列出pusedo code。不晓得这个说法
> 对不对(我现在用的是VC6)
>
> 谢谢
侯捷回覆:
> 1. 文中多次出现「内化」、「扩张」等词(尤其在constrctor)
> 中译本内中英对照表并未加以标注,建议你把他加进去,
> 因为这些字眼实在很少在其他书中看到。
谢谢你的建议。以下举两个例子。
原书 p11:
.. the likely internal transformation of the function looks as follows :
中译本 p13:
.. 这个函式有可能被内化为:
换言之我在这里所使用的「内化」一词,并无直接对应的英文,
而是依上下文翻译。
原书 p38:
.. the following two augmentations occur during compilation
中译本 p45:
.. 下面两个扩张行动会在编译期间发生:
换言之这里我所使用的「扩张」一词,就是 augmentations。是的,
C++ 编译器为我们加了许多码,是一种「扩张」行为。
> 2. p.26中的程式:
> ...
> 在VC中编译会出现转型上的错误,必须拿掉参数列const才可以执行。
好的,谢谢。各家编译器对 const 的松紧程度不一,
BCB4 和 G++ 对於 p.26 的程式都只给予 warning。
> 3. p52.中间:
> ".....这情况下并不需要合成出一个default copy constructor,
> 因为上述宣告展现了"default copy semantics"........."
> 这段话应如何解释呢?怎样才算是default copy semantics?
> "bitwise copy semantics"?
p53 中间偏下说得很清楚:
.. 什麽时候一个 class 不展现出 "bitwise copy semantics" 呢?
.. 有四种情况:
.. 1. ...
.. 2. ...
.. 3. ...
.. 4. ...
这四点以外的任何情况,便是拥有 "bitwise copy semantics"
(亦即 "default copy semantics")。
> 4. p.74
> 里面提到 member initialization list 在四种情形下可以
> 被使用(即使没有用,也可以正确编译,只是会造成效率不彰),
> 但LIPPMAN没有说明为何会造成编译器对以两种不同方式设定初值,
> 会扩展成为不同的码,是因为编译器设计上某种无法避免的需要?
> 还是有其他的原因
是因为 C++ 语言在设计上明白区分了 initialization 和 assignment
的不同。
你所谓「以两种不同方式设定初值」,意思是:
(1) 使用 member initialization list
(2) 不使用 member initialization list,而在 ctor 中使用 assignments.
为什麽编译器对於以两种不同方式设定初值,会扩展成为不同的码呢?
因为(以下节录自《C++ Primer 中文版》p719):
--- quote ---
两种作法...差别在於唯有 member initialization list 才
提供 class data members 的初始化行为。
而在 constructor 函式内将数值设定给 data member,其行为是一种
指派(assignment)动作。两者差异视 data member 的型别而定。
有一个观念很重要,那就是把 constructor 的执行想像为两阶段:
(1) 或隐喻(implicit)或明显(explicit)的初始化阶段
(initialization phase),(2) 一般化的运算阶段(computation phase)。
运算阶段由 constructor 函式内的所有述句组成,此阶段中对任何
data members 的设定动作都被视为一个指派动作(assignment),
而不是一个初始化动作(initialization)。如果不能够清楚区分出
其间的差异,便往往成为程式错误或效率不彰的来源。
初始化阶段可以是隐喻的(implicit),也可以是明显的(explicit),
视 member initialization list 是否存在而定。一个隐喻的初始化阶段
会唤起所有 base class 的 default constructors(根据 base class 的宣告
次序),然後再唤起所有 member class object 的 default constructors。
--- unquote ---
> 5. LIPPMAN书中常常会列出「经过扩展、内化」或是「转换」
> 过的原始码,藉由观察这些码,可以明显发现编译器暗中动了
> 哪些手脚,但这似乎是本书独有的特色,一般编译器多提供
> 机器码的对应,而不会列出pusedo code。不晓得这个说法
> 对不对(我现在用的是VC6)
对。
你恐怕误会了 pusedo code 的意思。pusedo code 是意思是
以某种型式的语言表现出某些实际动作。Lippman 在本书中以
大家熟悉的 C++ 语言(是的,本书读者应该都已熟悉了 C++ 语言)
来表现 pusedo code。事实上 C++ 编译器当然不会为我们的码
「扩展、内化、或转换」出那样的高层语言。
-- the end
--
※ Origin: 枫桥驿站<bbs.cs.nthu.edu.tw> ◆ Mail: [email protected]