- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
已经有一段时间了,我一直在用 C/C++ 编程,但有些领域仍然让我望而却步。也许我没有读过写得很好的权威 Material 。
(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 在构成整个程序的翻译单元和库集合中,每一个具有外部链接的特定标识符的声明表示相同的对象或功能。在一个翻译单元中,每个带有内部标识符的声明linkage 表示相同的对象或函数。每个标识符的声明都没有linkage 表示一个唯一的实体。
3 如果对象或函数的文件范围标识符的声明包含存储类说明符 static,则标识符具有内部链接。
4 对于在一个范围内使用存储类说明符 extern 声明的标识符该标识符的先前声明是可见的,如果先前声明指定了内部或外部链接,则后面声明中标识符的链接与先前声明中指定的链接相同。如果没有可见的先前声明,或者如果先前声明未指定链接,则标识符具有外部链接。
5 如果函数标识符的声明没有存储类说明符,则其链接的确定就好像它是用存储类说明符 extern 声明的一样。如果对象的标识符声明具有文件范围并且没有存储类说明符,它的链接是外部的。
阅读本文后,看起来如果我在 2 个源文件中声明一个像 int a 这样的变量。然后根据规则 5 和 4 都具有外部链接。然后根据规则 2,两者都应该引用同一个对象。那为什么编译器会产生问题。在标准中暗示我们不能在 2 个源文件中这样声明,这应该会引发编译错误。
谢谢。
最佳答案
回答您的问题-
大多数操作系统使用虚拟内存让每个程序认为它拥有所有地址空间。这意味着通常对程序大小的限制是系统中的物理内存量减去通常为无效(想想 NULL)指针和内核保留的少量内存。最大内存限制通常与平台相关,但在 32 位系统上,您的程序通常可以获得近 4GB 的内存,而在 64 位系统上则多得多。当然,您还必须考虑磁盘的大小,这限制了您可以拥有多少虚拟内存。理论上,您可以编写一个大到无法放入内存的程序,但除非您使用的是嵌入式设备(这确实是一个问题),否则我怀疑这种情况永远不会发生。
在大多数编程语言中,包括 C 和 C++,堆栈大小在编译时并不固定,而是从小开始,然后随着程序运行而增长。然而,堆栈增长的方式通常使它变得特别便宜 - 要获得更多空间,您只需要稍微增加堆栈指针即可。如果这会将您带到当前未分配给程序的内存中,操作系统通常会通过将页面与堆栈现在所在的虚拟地址相关联来为您分配内存,这比进行堆分配要快得多。从长远来看,这样做的成本通常可以忽略不计,所以不要气馁使用堆栈内存。有趣的是,一些较旧的编程语言,即 FORTRAN 的第一个版本,没有动态堆栈空间,因此递归是不可能的。几乎所有现代语言都消除了这些限制。
您是对的 - 当需要更多堆空间时,通常会调整页表以增加堆空间。许多内存分配器选择将大部分内存放入匿名内存映射文件中,以避免为此目的直接使用堆空间,但原理本质上是相同的 - 更新页表以为新内存腾出空间。
如果您在不同的文件中有两个全局变量链接在一起,那么两个目标文件都将包含符号链接(symbolic link),表明它们需要引用具有该名称的变量,并且两个目标文件都将包含定义说他们提供了这个名字的符号。当您尝试将它们链接在一起时,链接器会注意到在两个地方定义了相同的符号名称,并且会报告错误,因为它不确定应该使用其中的哪一个作为该全局变量的“the”实例。为了解决这个问题,至少在 C 中,您可以将全局变量标记为 static
以赋予它们内部链接。这使得符号不会全局导出,因此生成的目标文件可以在内部解析引用或破坏名称,以便它不会与其他文件中的其他符号冲突。 C++ 允许这一点以及匿名命名空间功能来实现相同的效果。
希望对您有所帮助!如果有人在这里发现错误或含糊之处,请告诉我,我很乐意纠正它们。
关于c++ - 关于编译程序如何与操作系统交互的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4989419/
在 python 交互中,有没有办法在每次输入命令后自动从 python 文件执行方法? 例如:如果我有一个打印文件信息的方法,但我不想不断调用该方法,我怎样才能让它在 python 交互中的每个命令
当你使用Edge等浏览器或系统软件播放媒体时,Windows控制中心就会出现相应的媒体信息以及控制播放的功能,如图。 SMTC (SystemMedia
我在主菜单上使用标准的剪切,复制,粘贴操作。它们具有快捷键Ctrl-X,Ctrl-C和Ctrl-V。 当我打开模态表单时FindFilesForm.ShowModal,然后所有快捷方式都可以从表单中使
这是我想要实现的目标:打开一个 shell(korn 或 bash,没关系),从那个 shell,我想打开一个 ssh 连接(ssh user@host)。在某些时候,可能会提示我输入密码,或者可能会
我正在测试在C / C++程序中嵌入Python,但是我缺乏理解。 测试程序很简单: 初始化解释器; 从启动Timer的文件中执行python脚本(每0.1秒增加一个变量); 等待5秒(C++); 从
我正在尝试用java创建Excel文件。现在,我正在使用 Apache POI 库创建文件并将其保存到本地驱动器。有没有办法启动 Excel 并填充数据而不将其保存到硬盘驱动器? 最佳答案 考虑 Do
我有一个黑盒函数,它接受大约 10 个整数输入。该函数返回一个 pandas 数据框,我想捕获输出窗口(通过使用 bbwidget.children)并显示在布局中的其他地方。到目前为止,交互/交互似
我正在体验新的 QQuickWidget。我如何在 QQuickWidget 和 C++ 之间进行交互? C++ QQuickWidget *view = new QQuickWidget(); vi
我正在尝试设置一个使用 TWAIN 的 C# 应用程序 example from code project 除了我需要将 Form 转换为 IMessageFilter 和调用 IMessageFil
我想在使用 redis 的 python 中编写应用程序。我用谷歌搜索,但找不到我的问题的任何结果。通常,我这样做: import redis rs = redis.Redis('localhost'
最近做一个小项目,网页中嵌入google maps,输入经纬度坐标可以定位地图位置并加注标记,点击标记获取远端摄像头数据并在视频窗口实现播放。在实际操作过程中,由于经纬度数据和视频登录的用户名密码数
我需要在这里澄清一些事情: 我有一个网站,每次在浏览器中重新加载网站时都会更新两个变量的值。这个页面显然是一个 HTML 页面,但变量是由 javascript 函数更新的。此页面在我的服务器上运行。
我注意到,auto忽略双条件。这是一个简化的示例: Parameter A B : Prop. Parameter A_iff_B : A B. Theorem foo1: A -> B. Proo
使用 interactive使用多个小部件相当简单,例如: interactive(foo, w1=widget1, w2=widget2, ...) 但是,我想使用 VBox 和 HBox 的组合以
我们提供类似于 imagemagick 的浏览器页面 JavaScript,可帮助人们将图像转换为不同大小和格式。但是,它需要网页交互。 是否可以让人们自动进行这种交互——无需将图像发送到我们的服务器
大家好,我正在尝试制作一个具有大量动画和效果的交互式 UI。 但我不知道是否: 核心图形可以支持用户交互(触摸、拖动等) 核心图形支持对象旋转 核心图形可以以任何方式与 UIKit 和核心动画交互 谢
这是获取维基百科上一篇关于高盛的文章的介绍的链接。 http://en.wikipedia.org/w/api.php?action=query&prop=extracts&titles=Goldma
我正在尝试编写一个 AppleScript 来查询 iCal 并在任何日历中查找给定日期的所有事件。 我首先编写了一个简单的脚本,它对给定日历中的每个事件执行一些简单的操作: tell applica
我在我的 hudson 服务器上使用 jira 插件。将代码提交到 svn 时,我的提交注释包含在我的 jira 问题中,但有什么办法可以将注释归因于执行提交的实际人员,而不是让一个全局 jira 用
我正在播放一段视频来装饰我的用户界面。我隐藏了 AV 播放器控件,但用户仍然可以控制视频。例如,他们可以使用滑动手势快进或快退。 这让我特别惊讶,因为 AVPlayerView 上面有一个覆盖 Vie
我是一名优秀的程序员,十分优秀!