在编写Win32 C/C++代码时,使用Windows特定函数如
lstrcpyn
或CopyMemory
是否有任何优势(例如性能?)与使用对应的CRT函数相比(除了CRT函数的可移植性之外)?至少一些CRT函数在内部使用Win32函数。此外,CRT需要额外的初始化(例如对于像strtok
这样的函数的线程特定数据)和清除,您可能不希望发生。
您可以创建一个纯Win32应用程序,没有任何依赖关系,包括CRT(就像您可以使用NTDLL.DLL
创建一个纯NT应用程序一样-我认为Windows的smss.exe
是这样的进程)。即使如此,我认为对于大多数应用程序来说都无所谓。
更新 由于人们似乎对个别功能的差异非常着迷,尤其是memcpy
与CopyMemory
,因此我想补充说明并非CRT中的所有函数都是Win32中的封装器。自然地,有些函数可以在没有Win32帮助的情况下实现(实际上,memcpy
就是一个很好的例子),而其他函数则不能。除了可移植性之外,我认为性能不是使用CRT的最佳论据。
你应该选择最适合你的东西,通常这将是CRT。而且,在您认为合适的地方使用单个Win32函数(具有CRT等效函数)也没有任何问题。
memcpy
这样的函数,选择Windows特定版本没有任何意义。保持简单和可移植,坚持使用标准C即可。mbstowcs
这样的其他函数,您可能需要使用MultiByteToWideChar
等其他功能,具体取决于您需要的功能。
memcpy
与CopyMemory
的例子中,Windows SDK的头文件将CopyMemory
定义为调用RtlCopyMemory
的宏,而RtlCopyMemory
又是调用memcpy
的宏。 - Matthewmemcpy
、memmove
、memcmp
、strlen
和memset
都是在ntdll.dll中实现的。因此CRT函数仍然是Win32函数的包装器,NtDll.dll函数的包装器,可以自行实现(例如格式化和数学),或者是入口点的一部分。例如,Rust除了数学和入口点之外,不使用MSVCRT做任何事情,甚至这也可能很快改变。 - alexchandel