哪个更有效:一个Win32功能。或类似的CRT功能。在VC ++应用程序中。?

时间:2010-12-16 20:35:21

标签: c++ c visual-c++ winapi

我开始使用win32编程很有趣,因为我喜欢复杂的东西,我喜欢编程(这就是Charles Petzold和Jeffrey Richter编写这些精美书籍的错误。)可能是因为我有性能代码的东西。

现在,真正的问题是:我将使用GetEnvironmentVariable()[win32 API函数]和getenv()[标准CRT函数]的示例。

这两个都返回作为参数提供的环境变量的值。

那么使用哪一个会更有效率,换句话说哪一个有更短的调用堆栈,哪一个更直接?想想一些函数。被称为百万次。

我相信他们中的任何一个都映射到另一个。我是对的还是我在这里遗漏了一些东西。

总结:在为win32 api编程时,如果api和c / c ++库中都提供了相同功能的函数,我应该使用哪一个?

感谢。

3 个答案:

答案 0 :(得分:6)

对于大多数应用而言,使用一个或其他API不太可能是主要的性能问题。

CRT和C ++标准库映射到Win32 API,因此使用Win32 direct会稍微提高效率。如果您需要编写可移植的C代码,请使用CRT。

在C ++中,大多数情况下,使用标准库可以更轻松地生成习惯性正确的代码,并且直接转到Win32会超过任何边际性能提升。

getenv可能不是一个很好的例子,因为映射到Win32是微不足道的。请考虑使用Win32 API再现<iostream>,并且好的库的好处会变得更加清晰。

答案 1 :(得分:3)

坚持使用CRT。它映射到WinAPI,但不一定是直接映射。例如,printf()可能映射到WriteConsole,但具有缓冲性能。如果GetEnvironmentVariable()不需要包含任何代码,那么getenv()将是相同的性能,如果它(如缓冲),则CRT应提供它。它是“正确的”,而不是“写”。

答案 2 :(得分:0)

这两个函数的性能可能相似,可能会从注册表中读取值。但更重要的是,它们没有理由成为关键性能问题:注册表是一个数据库,如果您需要一次又一次地使用注册表中的某些值,则将其缓存在某个变量中。