【发布时间】:2011-02-14 06:27:40
【问题描述】:
已经有一段时间了,我一直在使用 C/C++ 进行编程,但有些领域仍然让我难以理解。也许我没有阅读写得很好的和权威的材料。
(1) 在 Linux/Unix 中,用户程序的大小是否有限制?程序可以拥有的最大堆栈大小?用户程序可以使用的堆中的最大内存量?
(2) 我了解 C 可执行文件具有数据部分、代码部分和堆栈部分。如果程序要进行许多递归调用,它将需要大量的堆栈。这个堆栈是预定义的大小还是会随着递归的增加而增长。在增长的情况下,程序的地址空间是否也必须动态增加?如果是这样,那会不会减慢程序的速度?
(3) 同样,当程序mallocs时,当堆内存分配给程序时,堆的那个区域是否需要添加到程序的地址空间?因此在这种情况下,也需要更新程序的页表。我的理解正确吗?
(4) 为什么 2 个文件(我打算将它们组合成一个可执行文件)不能有一个同名的全局变量。这将有助于了解目标文件的外观。
加法:
我正在阅读来自http://www.open-std.org/jtc1/sc22/wg...docs/n1256.pdf 的 ISO C99 标准。 它在第 42 页上说:
6.2.2 标识符的链接 1 一个标识符可以在不同的作用域或同一作用域中多次声明 通过称为链接的过程来引用相同的对象或函数。有 三种链接:外部、内部和无。
2 在构成整个程序的一组翻译单元和库中,每个 具有外部链接的特定标识符的声明表示相同的对象或 功能。在一个翻译单元内,每个标识符的声明都带有内部 链接表示相同的对象或函数。每个标识符的声明都没有 链接表示一个唯一的实体。
3 如果对象或函数的文件范围标识符的声明包含存储类说明符 static,则该标识符具有内部链接。
4 对于在一个范围内使用存储类说明符 extern 声明的标识符 该标识符的先前声明是可见的,如果先前声明指定了内部或外部链接,则后面声明的标识符的链接与先前声明中指定的链接相同。如果前面的声明不可见,或者前面的声明没有指定链接,则标识符具有外部链接。
5 如果函数的标识符声明没有存储类说明符,则其链接的确定与使用存储类说明符 extern 声明时完全相同。如果对象的标识符声明具有文件范围并且没有存储类说明符,它的链接是外部的。
读完后,如果我在 2 个源文件中声明一个变量,比如 say int a。然后根据规则 5 和 4 都具有外部链接。然后根据规则 2,两者都应该引用同一个对象。那么为什么编译器会产生问题。在标准中暗示我们不能在 2 个源文件中这样声明,这应该会引发编译错误。
谢谢。
【问题讨论】:
-
-1。四个问题应该作为四个问题发布,以便将来可以搜索。当前标题不可搜索
标签: c++ c linux memory compilation