2010-02-01 92 views
2

当我在Turbo C编译器中选择“大内存模型”而不是“小内存模型”时,它会有什么不同?小内存模式和大内存模式有什么区别?

这是如何改变我的程序的行为?

关于, essbeev。

+2

这是过时的术语......你在写DOS程序吗? –

+0

http://en.wikipedia.org/wiki/C_memory_model – Paolo

回答

7

它指的是非常古老的16位内存模型的概念。 32bit & 64位计算机对这些内存模型一无所知。

因此回到您的问题:小 - 声明指针允许您只处理64k的数据或代码。指针长度为16位。整个程序都在单个64k段中。要显式地寻址另一部分内存,你需要显式地将指针声明为FAR。大 - 声明指向代码或数据的指针有32位,所以默认为FAR。

希望你不会在这些问题上持续这么久,因为它是过时的概念。

+0

32位和64位x86机器知道大约16位内存模型,但很少有人运行一个操作系统,可以让你在当今时代访问它。 – kusma

+0

@kusma不,他们没有。要运行纯粹的16位应用程序类似NT的窗口需要启动所谓的WoW(Windows上的窗口)。 16位和32位内存模型之间的强大差异 - 被称为“32位保护模式”或平面模型。 – Dewfy

+0

机器可以,否则你将无法启动,因为CPU在BIOS屏幕后以16位实模式启动。 WoW是纯粹的Windows构造(请参阅http://en.wikipedia.org/wiki/Windows_on_Windows),并且在CPU切换到64位模式后发生。 平面记忆模型和真实模式之间的差异并不完全是您所想的。在进入保护模式时,将x86 CPU保留在16位模式是完全可能的。事实上,保护模式被添加到286(见http://en.wikipedia.org/wiki/Protected_mode#The_286),它是一个16位的CPU。 – kusma

1

8086处理器有奇怪的20位寻址使用16位段寄存器和16位偏移量的组合。为了简化这一点,您可以将这两个指令打包在一个32位FAR指针中,或者您可以使用缺省的segmet寄存器并将低16位存储在NEAR指针中。

smalllarge型号之间的区别仅仅在于,如果未明确指定,指针默认为NEARFAR

相关问题