Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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++ 这是使用DLL的好方法吗?(C+;+;?)_C++_Performance_Dll - Fatal编程技术网

C++ 这是使用DLL的好方法吗?(C+;+;?)

C++ 这是使用DLL的好方法吗?(C+;+;?),c++,performance,dll,C++,Performance,Dll,我有一个这样运行的系统: main.exe运行sub.exe运行sub2.exe 等等等等等等 那么,将sub和sub2更改为DLL会更快更有效吗 如果可以的话,有人能告诉我在不改变大量代码的情况下制作DLL的正确方向吗?这取决于它们的运行频率。如果,进程的中断是一个巨大的成本。如果你的程序(main.exe)仅仅是启动与之无关的程序,继续做你正在做的事情。如果sub.exe和sub2.exe包含main.exe将受益的功能,请将它们转换为DLL,以便main.exe可以调用其中的函数 说到效率

我有一个这样运行的系统:

main.exe运行sub.exe运行sub2.exe

等等等等等等

那么,将sub和sub2更改为DLL会更快更有效吗


如果可以的话,有人能告诉我在不改变大量代码的情况下制作DLL的正确方向吗?

这取决于它们的运行频率。如果,进程的中断是一个巨大的成本。

如果你的程序(main.exe)仅仅是启动与之无关的程序,继续做你正在做的事情。如果sub.exe和sub2.exe包含main.exe将受益的功能,请将它们转换为DLL,以便main.exe可以调用其中的函数

说到效率,这取决于sub.exe和sub2.exe的大小。请记住,加载dll也意味着开销。

dll肯定比单独的可执行文件快。但是将它们分开允许更大的灵活性和重用(想想unixshell脚本)

似乎是一个很好的Win32 DLL教程


至于代码没有太多更改,我假设您只是使用命令行参数将信息传递给这些sub。在这种情况下,只需重命名
main
函数,从DLL中导出它们,然后从主程序中调用这些重命名的“
main
”函数。

DLL实际上也是可执行的。它们符合PE标准,该标准涵盖了windows的多个常见文件扩展名,如.exe、.dll、.ocx

当你启动两个可执行文件时,它们都有自己的地址空间、内存等等。但是,当加载可执行文件和dll时,dll会加载到可执行文件的进程空间中,因此它们共享很多内容


现在,根据您的3个可执行文件如何一起通信(如果它们甚至一起通信),您可能需要重写一些代码。基本上,拥有dll的一般方法是从程序内部简单地调用dll函数。这通常比进程间通信简单得多

有几个因素需要考虑。首先,您多久运行一次该序列,其他可执行文件执行作业的时间有多长?如果您不经常调用它们,并且它们执行的作业不是很短,那么加载时间本身就变得无关紧要了。在这种情况下,我会说,任何适合其他需要的都可以。如果,OTOH,你给他们打了很多电话,我会说让他们成为DLL。加载它们一次,从那时起,每次调用的速度都与对本地函数的调用一样快


至于将exe转换为dll,这应该不是很复杂,但在使用dll时,有一些地方需要特别注意:使用dllmain进行初始化有一些常规main没有的限制(同步问题);您必须记住dll与exe共享地址空间;CRT版本的差异可能会使您感到悲伤。

将它们转换为dll,以防止用户在未启动main的情况下意外运行sub1或sub2,不是更安全吗?

加载dll的开销比启动exe的开销小得多