⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 00000003.htm

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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -