📄 00000003.htm
字号:
<BR>======================================== <BR> <BR>Q124:为什麽我的执行档会这麽大? <BR> <BR>很多人对这麽大的执行档感到惊讶,特别是当原始码只有一点点而已。例如一个简单 <BR>的 "hello world" 程式居然会产生大家都想不到的大小(40+K bytes)。 <BR> <BR>一个原因是:有些 C++ 执行期程式库被连结进去了。有多少被连结进去,就要看看 <BR>你用到多少,以及编译器把程式库切割成多少块而定。例如,iostream 很大,包含 <BR>一大堆类别及虚拟函数,即使你只用到一点点,因为各元件之间的交互参考依存关系 <BR>,可能会把整个 iostream 程式码都塞进来了。(【译注】如果 linker 做得好的话 <BR>,应该能把完全用不到的元件 object code 砍掉,不随之塞入你的执行档中。) <BR> <BR>不要用静态的,改用动态连结的程式库版本,就可以使你的程式变小。 <BR> <BR>欲知详情,请看看你的编译器手册,或是寻求厂商的技术支援。 <BR> <BR> <BR>=============================== <BR>■□ 第21节:特定系统的细节 <BR>=============================== <BR> <BR>Q125:GNU C++ (g++) 把小程式造出大大的执行档,为什麽? <BR> <BR>libg++(g++ 用到的程式库)可能在编译时带有除错的资讯(-g)。有些机器上,不 <BR>带除错资讯地重新编译它,会省下很大的磁碟空间(~1 MB;缺点是:不能追踪到 <BR>libg++ 的呼叫)。仅仅 "strip" 掉执行档,比不上先用 -g 重新编译,再 "strip" <BR>掉 a.out 档来得有效。 <BR> <BR>用 "size a.out" 来看看执行码的程式与资料区段到底占了多大空间,而不要用 <BR>"ls -s a.out" 这种包括了符号表格(symbol table)的方式。 <BR> <BR>======================================== <BR> <BR>Q126:有 YACC 的 C++ 文法吗? <BR> <BR>Jim Roskind 是 C++ 的 YACC 文法作者,它大体上和部份 USL cfront 2.0 所实作 <BR>出来的语言相容(没有 template、例外、执行期型态识别功能)。这份文法有些地 <BR>方和 C++有细小而微妙的差别。 <BR> <BR>它可用 anonymous ftp 到下列地方取得: <BR> * ics.uci.edu (128.195.1.1) in "gnu/c++grammar2.0.tar.Z". <BR> * mach1.npac.syr.edu (128.230.7.14) in "pub/C++/c++grammar2.0.tar.Z". <BR> <BR>======================================== <BR> <BR>Q127:什麽是 C++ 1.2? 2.0? 2.1? 3.0? <BR> <BR>这些不是“语言”的版本,而是 cfront 这个由 AT&T 做出来的、最早的 C++转译程 <BR>式的版本编号。以这编号来“代表”C++ 语言的演进,已经是公认的惯例了。 <BR> <BR>“非常”粗略地讲,主要的特徵有: <BR> * 2.0 包含多重/虚拟继承,以及纯虚拟函数。 <BR> * 2.1 包含半巢状 (semi-nested) 类别,及 "delete [] 阵列指标"。 <BR> * 3.0 包含全巢状 (fully-nested) 类别、template 和 "i++" vs "++i"。 <BR> * 4.0 将包含例外处理。 <BR> <BR>======================================== <BR> <BR>Q128:如果签名编码标准化了,我能否将不同厂商编译器产生的程式码连结起来? <BR> <BR>简短的回答:可能不行。 <BR> <BR>换句话说,有人希望标准化的签名编码规则能并入拟议中的 C++ ANSI 标准,避免还 <BR>要为不同厂商的编译器购买不同版本的物件程式库。然而不同的系统实作中,签名编 <BR>码的差异性只占一小部份而已,即使是在同一个基台(platform)上。这里列出一部 <BR>份其他的差异处: <BR> <BR>1) 成员函数隐含的引数个数和型态。 <BR> 1a) 'this' 有被特殊处理吗? <BR> 1b) 传值的指标放在哪里? <BR>2) 假设有用到 vtable 虚拟表格的话: <BR> 2a) 它的内容及配置? <BR> 2b) 多重继承时,'this' 在何处/如何调整? <BR>3) 类别如何配置,包含: <BR> 3a) 基底类别的位置? <BR> 3b) 虚拟基底类别的处理? <BR> 3c) 虚拟表格指标的位置,如果有用虚拟表格的话? <BR>4) 函数的呼叫惯例,包含: <BR> 4a) 呼叫者还是被呼叫者负责调整堆叠? <BR> 4b) 实际参数放到哪里? <BR> 4c) 实际参数传递之顺序? <BR> 4d) 暂存器如何存放? <BR> 4e) 传回值放到哪里? <BR> 4f) 对传入/传回 struct 或 double 有无特殊的规定? <BR> 4g) 呼叫末端函数(leaf function)有无特殊的暂存器存放规定? <BR>5) run-time-type-identification 如何配置? <BR>6) 当一个例外被 throw 时,执行期的例外处理系统如何得知哪一个区域物件该被解 <BR> 构? <BR> <BR> <BR>======================================= <BR>■□ 第22节:其他的技术和环境的事项 <BR>======================================= <BR>● 22A:其他的技术事项 <BR>======================== <BR> <BR>Q129:为什麽有 static 资料成员的物件类别产生了 linker 错误? <BR> <BR>Static 的资料成员必须外显地在唯一的模组中定义。 <BR> ^^^^^^ ~~~~~~^^^^ ^^^^ <BR>【译注】这句话要逐字细读。原文是:Static data members must be <BR> explicitly defined in exactly one module. <BR> <BR>譬如: <BR> class Fred { <BR> public: <BR> //... <BR> private: <BR> static int i_; // 宣告 static 资料成员 "Fred::i_" <BR> //... <BR> }; <BR> <BR>Linker 会告诉你 "Fred::i_ is not defined(未定义)" ,除非你在任何一个(且 <BR>唯一)原始档中定义(而非宣告)了 "Fred::i_" : <BR> <BR> int Fred::i_ = 某个会产生 int 的运算式; <BR>或是: <BR> int Fred::i_; <BR> <BR>通常我们会在 "Fred.C" 档中定义 "Fred" 类别的 static 资料成员(或 "Fred.cpp" <BR>等等你使用的副档名)。 <BR> <BR>======================================== <BR> <BR>Q130:"struct" 和 "class" 关键字差别在哪? <BR> <BR>struct 的成员和基底类别, 都是预设为 public 的,而 class 则预设为 private。 <BR>注意:你应该“明显地”把基底类别设为 public、private 或是 protected,而不 <BR>要依赖预设值。 <BR> <BR>除此之外,两者的功能是相等的。 <BR> <BR>======================================== <BR> <BR>Q131:为什麽不能以函数的传回值来多载(overload)它? <BR> <BR>如果你同时宣告了 "char f()" 及 "float f()" ,编译器会给你个错误讯息,因为 <BR>呼叫 "f()" 会造成模拟两可的情况。 <BR> <BR>======================================== <BR> <BR>Q132:什麽是「持续性」?什麽是「持续性物件」? <BR> <BR>一个持续性物件 (persistent object),在创造它的程式执行结束後,仍可存活下来 <BR>。它甚至可存活於不同的父程式,存活於磁碟系统、作业系统、甚至於作业系统所处 <BR>的硬体上。 <BR> <BR>持续性物件的困难在於:如何有效地在次储存体中,存放它们的运作行为(method) <BR>及资料位元(以及所有成员物件的资料和运作行为,及它们所有的成员物件、基底类 <BR>别……等等)。这一切都得自己来做的话,可不是件容易的事。在 C++中,你就得自 <BR>己来。C++/OO 的资料库系统,会替你把这些机制都隐藏起来。 <BR> <BR>======================================== <BR> <BR>Q133:为什麽浮点数 (floating point) 这麽不精确?为什麽这段程式不会印出 0.43? <BR> <BR> #include<iostream.h> <BR> <BR> main() <BR> { <BR> float a = 1000.43; <BR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -