提示:阅读这些内容时请参照《windows核心编程》原文或其中文译本。以下内容重点针对中文译本。
第15章 在应用程序中使用虚拟内存
P401第三段:
举个例子,设想我们要在进程地址空间第50MB的地方分配区域。在这个例子中,我们需要传52 428 800(50*1024*1024)给pvAddress参数。如果这个内存地址有一块足够大的闲置区域能满足我们的请求,那么系统会把这块区域——也就是我们想要的区域——预订下来并返回。如果这个内存地址没有闲置区域,或者闲置区域不够大,那么系统将无法满足我们的请求,这时VirtualAlloc会返回NULL。注意,传给pvAddress参数的地址必须始终位于进程的用户模式分区中,否则VirtualAlloc会失败并返回NULL。
原文:
For example, say that you want to allocate a region starting 50 MB into your process' address space. In this case, you pass 52,428,800 (50 × 1024 × 1024) as thepvAddress parameter. If thismemory address has a free region large enough to satisfy your request, the system will reserve the desired region and return. If a free region does not exist at thespecified address or if the free region is not large enough, the system cannot satisfy your request andVirtualAlloc returns NULL. Note that any address you pass for the pvAddress parameter must always reside in your process' user-mode partition or the call toVirtualAlloc will fail, causing it to returnNULL.
我们可以对比看到,这个翻译基本上能对得上原文,问题是:如果原文表达有一些细微问题会影响初学者的理解,是否翻译的时候要修改过来呢?按我的理解,作者的memory address和specified address表达的内容是“进程地址空间的地址”,如果按译者使用的”内存地址“,未免有点偏差。内存地址指物理内存地址呢?还是进程地址空间的地址?按我个人的理解,这两个地方都应该明确指出是进程地址空间的地址,以区分物理地址。因为这个时候只以预订进程地址空间里的地址,这些地址是没有映射到真金实银的物理存储器(包括内存卡和硬盘上的)上面的。
另外指出,像这类偏差的内容在译本上普遍存在,比如原文的”physical storage“,译者有时候译做内存,有时候译作”物理存储器“。在内存管理这部分章节出现这样的偏差对理解会造成很大的影响。真希望这样的书让像侯捷和潘爱民这样的专家来译,不仅细心专注,对于原书上的例子都亲自测试过才敢写,而且修改原著中会造成偏差的内容,对读者负责。
程序员本来是个从事精细的工作的人群,而其中书籍的准确性无数学专著高,读者素质也无哲学之类的高,而译者当然就有可能混而渡日。有可能迫于生活压力,以至于一年译三到五本书,质量自然就不敢恭维了。