C++ 在为特定操作系统编写代码时,标准库调用与所有OS API调用之间的权衡是什么?

C++ 在为特定操作系统编写代码时,标准库调用与所有OS API调用之间的权衡是什么?,c++,api,standard-library,C++,Api,Standard Library,在为一个操作系统编程时,使用标准库调用与操作系统的API调用相比,有哪些优点和缺点 例如,在C++中,我专门为Windows编程,所以我应该这样做< /P> memcpy(studentCopy, student, sizeof(Student)); 或者坚持使用Windows API调用,例如: CopyMemory(studentCopy, student, sizeof(Student)); 我不确定哪种约定更好,并且一直无法从搜索中找到任何内容。这仅仅是偏好吗 编辑:学生的事情只是使

在为一个操作系统编程时,使用标准库调用与操作系统的API调用相比,有哪些优点和缺点

例如,在C++中,我专门为Windows编程,所以我应该这样做< /P>
memcpy(studentCopy, student, sizeof(Student));
或者坚持使用Windows API调用,例如:

CopyMemory(studentCopy, student, sizeof(Student));
我不确定哪种约定更好,并且一直无法从搜索中找到任何内容。这仅仅是偏好吗


编辑:学生的事情只是使用不同图书馆的一个例子,并不是专门问这个问题,而是首先想到的事情。

取决于你想要实现什么,真的

使用Windows API调用将使代码不可移植

此外,编译器通常“理解”诸如
memcpy
strcpy
,等等,并且可以根据实际操作进行巧妙的优化(例如,使用SSE指令用4条指令复制32个字节,而不是将三个值传递给一个函数并在该函数中执行复制)[必须检查对齐和大小,然后确定如何实际制作副本]

我个人只会在“不可避免”的情况下使用Windows API调用,也就是说,没有其他简单的方法可以实现预期的结果。如果有C/C++标准功能,那么就使用它

当然,在面向对象的设计中,您可能不想使用
memcpy
来复制变量,因为它们可能不是同一类和/或非平凡的构造函数/析构函数,所以

studentCopy = student; 

无论采用何种系统,这都是我的首选解决方案。

这取决于具体情况

标准库的优势在于代码的可移植性。 OS API的优势在于可能更好/更合适地实现特定OS/环境所需的功能。这在较低级别的编程中尤其常见,例如连接硬件或在内核中编写。例如,在Windows内核中,标准库不受官方支持(尽管某些功能可以工作)

选择API时要考虑的另一个原因是遵守可能需要/禁止某些API的各种SW证书(如果需要的话)。


<>和最后但并非最不重要的原因是代码的进一步维护和可读性的一致性-努力不混合不同类型的API。

< P>使用OS库只能导致较低的占用率——如果您成功地消除了对C++标准库的每一个引用,就可以避免与它的链接。

通常这不值得付出努力,但是对于一些场景(例如,诊断C++运行时DLL是否存在于系统上的诊断工具),它可能是非常有用的。


(正如icepack提到的,这只适用于使用操作系统文件中实现的函数,如果您想保持尽可能低的占用空间,请小心避免操作系统供应商提供的额外库,但需要单独重新分发)

是的,与操作系统特定的API.As(类或结构?)相比,选择STL始终是一个好的做法Student、其基类或其数据成员可能有特定的赋值运算符,我更喜欢:studentCopy=Student;取决于操作系统特定的调用是否提供更多功能。例如,Windows调用支持大于4 GB的文件,“…ex”某些调用的版本:。可能很有用。为什么所有的关闭请求?这是一个很好的解决方案question@icepack:嗯,它是基于意见的,真的。我希望用“折衷是什么?”取代“哪个更好?”可以挽救它。你说的“理解”的编译器是什么意思memcpy、strcpy等等。他们通过包含相关的头来理解它,就像任何其他函数一样,认为msvc++优化memcpy比优化CopyMemory要好是愚蠢的。@zneak:这只是因为在windows.h中定义CopyMemory memcpy(确实有一个从系统DLL导出的
CopyMemory
函数,但是windows标题中没有它的原型)@zneak:我不知道,因为源代码已经“关闭”,我目前正在将我的上一台windows机器转换为Linux(我知道gcc和clang都对公共库函数有着特殊的认识。[Ben Voigt刚刚回答了这个特殊情况-这是同一件事,所以使用CopyMemory没有任何好处]@BenVoigt,我也可以找到memcpy的导出。它的定义是轶事,之所以成为可能,是因为MS不必在两者之间做出选择。我认为,说标准函数将优于平台函数是毫无根据和误导的(尽管它们很可能优于同等的用户函数)一个标准的库胜过它所承载的平台,说明它是一个非常脆弱的平台,fread是否比read更快,甚至与read一样快?同样的推理也适用于与特定操作系统的链接libraries@icepack:哼?操作系统库已经在系统上了;它们不是应用程序占用空间的一部分。有些操作系统库以静态库的形式出现,没有静态库就无法使用linkage@icepack: 我认为您可能正在讨论一个不同于此问题的操作系统(尽管我认为通用答案也很有趣)事实上,它与Windows非常相关。我在Windows内核中经常遇到这种情况,其中某些驱动程序框架是在静态库中定义的。诚然,用户空间代码可能不太常见,但问题的范围更广。