推断 c++ 中函数的实现

Inferring the implementation of a function in c++

本文关键字:实现 函数 c++ 推断      更新时间:2023-10-16

我正在浏览 c++ 中rand()函数的文档,它说

该函数访问和修改内部状态对象,这可能会导致并发调用 rand 或 srand 的数据争用。一些库提供了一个替代函数,明确避免了这种数据竞争:rand_r(不可移植)。允许C++库实现来保证调用此函数时不会出现数据争用。

作为一个更普遍的问题,我如何确定我正在调用函数的 c++ 实现(在这种情况下rand)?

  • 在具有.cc.cpp扩展名的文件中调用rand()
  • 或者,任何可以确保这一点的特定标头

我问这个问题是因为我的理解是,当我使用cstdlib标头时,它反过来调用该 (stdlib.h) 的 c 实现。如果不是这种情况,那么 c++ 是否为所有 c 函数提供自己的实现?

我认为你问错了问题。

您已经阅读过,C++库实现都可以为您提供没有数据争用的版本。它们是允许的,但不是必需的。如果你有一些无所不知的预言机,能够告诉你你是否正在使用C++实现,如果它告诉你你是,这会解决你的问题吗?不,不是真的,因为你仍然不知道这种实现是否能保证没有数据竞争。也许会,但你不确定。

所以你必须问一个正确的问题:我怎么知道我正在使用的功能是否保证了这一点?答案是:检查您正在使用的库的特定文档!我想你正在阅读兰德的 cplusplus.com 页面。这是一个通用站点,与特定库无关,因此它不会帮助您回答此问题。相反,您使用的是什么编译器和标准库?检查他们的文档。如果作者声明他们的rand功能保证是无种族的,那么继续使用它。否则,保守并假设有一些种族,并且不要使用它。

顺便说一句,很多人会告诉你应该避免那个网站,因为它不是很可靠。一般来说,首选 cpp 首选项。它说

rand() 是否是线程安全的,这是实现定义的。

"定义实施"的意思正是我所说的。如果你继续阅读,它还会列出一些其他问题(它生成的数字毕竟不是随机的),并且

建议使用 C++11 的随机数生成工具来替换 rand()。