system("PAUSE") 肯定不太理想。使用对系统的调用会创建一个子进程,这在 Windows 上是相当昂贵的,并且无论如何在任何操作系统上都不是非常便宜。在嵌入式系统上,内存开销很大。
如果有任何方法可以在本地没有太多痛苦,那就去做吧。在等待用户按下单个按钮的情况下,cin.get() 将很难被击败。在这种情况下,您的应用程序进程只会阻塞标准输入,只设置内核可见的几个标志,最重要的是,不会分配新内存,也不会创建新的调度实体,甚至不会创建中断处理程序。
此外,它在具有所有 c++ 编译器的所有操作系统上都可以正常工作,因为它仅使用该语言非常标准部分的一个非常基本的特性,而不依赖于操作系统提供的任何东西。
编辑:预测您担心它是否昂贵并不重要,因为整个 想法 是暂停。好吧,首先,如果它很贵,那么它会损害可能发生的其他任何事情的性能。有没有注意到(在 Windows 上)当一个应用程序启动时,其他已经打开的应用程序也变得不那么响应了?此外,您的用户可能不是一个活生生的人,而是另一个代表人类用户工作的程序(例如,一个 shell 脚本)。该脚本已经知道下一步该做什么,并且可以在标准输入中预先填充一个字符以跳过等待。如果您在此处使用了子进程,则脚本将经历(人类可察觉的)延迟。如果脚本这样做数百(或数亿!)次,则可能需要几秒钟才能运行的脚本现在需要数天或数年。
EDIT2:何时使用system():当你需要做一些其他进程做的事情时,你不能轻易做到。 system() 并不总是最好的候选人,因为它做了两件有些限制的事情。首先,与子进程通信的唯一方法是通过命令行参数作为输入,返回值作为输出。第二个是父进程阻塞,直到子进程完成。这两个因素限制了系统可用的情况。
在 unixy 系统上,大多数子进程都使用fork,因为它允许同一个程序作为两个独立进程在同一个地方继续,一个作为另一个进程的子进程(除非您从操作系统)。在 Linux 上,这特别优化,并且与创建 pthread 一样便宜。即使在速度不那么快的系统上,它仍然非常有用(正如 apache 进程池方法所证明的那样)(在 windows/link to unix docs 上不可用)
其他情况(在 Windows 上也是如此!)通常由 popen 或 exec 系列函数处理。 popen 创建一个子进程和一个连接到子进程的标准输入或标准输出的全新管道。然后,父进程和子进程都可以同时运行并很容易地进行通信。 (link to windows docs/link to unix docs)
exec* 系列函数(有几个,execl,execv 等)另一方面会导致当前程序被新程序替换。原始程序不可见地退出,新进程接管。当新进程返回时,它将返回到任何所谓的原始进程,就好像该进程在那个时候已经返回而不是消失一样。与exit(system("command")) 相比,它的优势在于不会创建新进程,从而节省时间和内存(尽管并不总是非常多)(link to windows docs /link to unix docs)
system 可能被某些脚本工具用于调用某些配方操作中的多个步骤。例如,在某个时刻,程序可以使用system 调用文本编辑器来编辑某个配置文件。它不需要太关心发生的事情,但它当然应该等到用户保存并关闭编辑器后再继续。然后它可以使用返回值来确定编辑会话是否成功,即编辑器实际上打开了请求的文件(并且编辑器本身根本存在!),但将从中读取会话的实际结果直接编辑文件,而不是与子进程通信。 (link to windows docs/link to unix docs)