Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
流和系统触摸的标准:: 剖析我的C++程序之一,我发现调用STD::FULATE(),创建一堆文件时,比使用系统“触摸”要花费的时间要少。_C++_Linux - Fatal编程技术网

流和系统触摸的标准:: 剖析我的C++程序之一,我发现调用STD::FULATE(),创建一堆文件时,比使用系统“触摸”要花费的时间要少。

流和系统触摸的标准:: 剖析我的C++程序之一,我发现调用STD::FULATE(),创建一堆文件时,比使用系统“触摸”要花费的时间要少。,c++,linux,C++,Linux,所以现在我想知道std::ofstream在Linux上映射到什么操作系统函数 您知道std::ofstream()调用什么来创建文件吗 谢谢,你也应该考虑代码的执行开销>触碰作为二进制。我相信性能的提高主要是由于在测量流的时内存中有一个持久的二进制文件,如果您使用系统(“touch filename”)这是误导和缓慢的(和安全风险,和…)。它不会这样调用系统,而是生成一个shell,然后在其中运行程序(本例中为touch)。 打开流将使用某种可以直接访问文件系统的实际系统调用。可能是在Linu

所以现在我想知道std::ofstream在Linux上映射到什么操作系统函数

您知道std::ofstream()调用什么来创建文件吗


谢谢

,你也应该考虑代码的执行开销>触碰<代码>作为二进制。我相信性能的提高主要是由于在测量流的

时内存中有一个持久的二进制文件,如果您使用
系统(“touch filename”)这是误导和缓慢的(和安全风险,和…)。它不会这样调用系统,而是生成一个shell,然后在其中运行程序(本例中为touch)。
打开流将使用某种可以直接访问文件系统的实际系统调用。可能是在Linux上。
尝试在终端中运行
strace touch
,以了解它正在进行的系统调用。你可以用一个简单的C++程序来做同样的事情,你只需要打开一个文件。或者,如果您使用的是开放源代码实现(gcc),您可以检查源代码。

考虑
system()
。它将fork/exec一个shell,该shell将从磁盘加载touch二进制文件、共享lib等,执行它,清理进程并返回

如果您只是使用touch创建不存在的文件,那么它主要相当于std::ofstream.open(),它将执行一些函数调用,并最终解析为系统调用
open()
,最终解析为
close()
。快多了。但是,如果您真的在模拟
touch
的功能,那么它就更复杂了。例如,如果文件已经存在,它只会更改时间戳等,并且会涉及更多内容


<> P>不管您的实际使用情况,C++中的代码要比通过代码>系统()/代码>运行外部程序快得多。

您是从命令行或程序内发出“代码>系统”“触摸”<代码>,作为函数调用<代码>系统(“touch…”);代码>?如何比较C++函数(STD::OFFASH构造函数)与可执行文件(/bin/touch)的性能?是的,我使用StaseAudio(或),更好的是:SaveTFF(TEMP,“Touch %s”),qPrimTable(文件名)。但从回答中,我现在明白了为什么会有这么大的开销。好的一点,我相信在执行touch时会创建一个操作系统进程。有点离题,但这可能会帮助像我这样的其他人。我想从mac应用程序中创建一个文件。系统(“触摸文件名”)完成了该任务,但它是在磁盘根目录上创建的。怎么会?我想它会选择相对路径,并在同一路径中触摸文件。。。太棒了@臭蛋:你有点忽略了重点,那就是
system()
是邪恶的,不要使用它!但碰巧今天我试着用进程返回值测试一些东西,遇到了类似的问题!在某些平台上,它可以找到本地程序,在某些平台上,它无法找到<代码>系统
启动一个新的shell,我想没有什么可以说新的shell将在程序运行所在的同一目录中启动,尽管它似乎在Linux上启动。不管怎么说,posix标准说会的。是的,我从你的答案中得到了答案:)但我只是做了一个小测试,让它过去对我来说是一个大问题。不过你说得很清楚,谢谢!事实上,我刚刚在Linux、Solaris和AIX上测试了
system(“pwd”)
,它们都给了我开始时使用的相同目录(Solaris扩展了一个软链接)。总之,我不知道。