哪些标准C++功能可用于查询机器/ OS架构?

use*_*717 16 c++ computer-architecture c++11 c++14

用于查询程序运行的硬件或操作系统功能属性的标准C++功能和实用程序是什么?
例如,std::thread::hardware_concurrency()为您提供机器支持的线程数.
但是,如何检测计算机具有多少RAM,或者进程使用了​​多少RAM,或者在某个目录中可以写入多少磁盘空间,或者有多少L2缓存可用?

我更喜欢通过()标准的答案,但TR2或者建议也会很好.

Lig*_*ica 21

你如何检测计算机有多少RAM,或者进程使用了​​多少RAM,或者在某个目录中可以写入多少磁盘空间,或者有多少L2缓存可用?

你没有.准确地说,这些都不是C++语言的范畴,它描述了一个抽象机器.

它会告诉你可用的内核数量的唯一原因是因为否则其多线程模型将接近没用,即使如此,它以抽象的方式这样做("硬件并发"是不是"在桌面的物理CPU的数量PC").


πάν*_*ῥεῖ 17

" std::thread::hardware_concurrency()给你机器支持的线程数......"

不,它没有.确切地说(引自这里)

std::thread::hardware_concurrency()...返回实现支持的并发线程数.该值应仅被视为提示.......
如果值没有明确定义或不可计算,则返回?0.

最好的做法是让你知道,有多少CPU内核可用于线程的真正并行执行(请参阅Orbit的答案中的@Lightness Races).
您仍然可以拥有所需数量的线程实例,直到获取一个失败.


"你如何检测计算机有多少RAM,或者进程使用了​​多少RAM,......"

所有这些功能,如RAM可用等都是高度依赖机器/操作系统的,并且不能用标准的c ++函数或类查询(至少我不知道).

"......或者在某个目录中可以写入多少磁盘空间,..."

C++标准库也没有像文件系统目录这样的东西的概念......

"......或者有多少L2缓存可用"

......甚至更少关于这种高度MCU特性的观点1.

C++使用完全抽象的,机器架构和操作系统不可知的世界观.

1)感谢GOD,Bjarne和c ++标准委员会,否则我会遇到严重的问题,为我面临的各种目标编写中途可移植代码.如果它失败了,并且无法证明我方面的错误违反了标准,则很可能是实际编译器实现的错误.这至少阻碍了我的合作编码人员为了进行不必要的和模糊的微优化尝试而陷入困境:-D.


所有上述说法:

您可以获得最接近的,使用当前标准要求一些机器架构的基本特征和功能<cstddef>,<limits>以及<type_traits>恕我直言.

虽然最新的标准定义(例如,或文件系统实验库)采用了一些常见的"最先进"技术和抽象.std::threadstd::chrono


TC.*_*TC. 7

正如其他人所指出的,用于获得系统的这种属性的功能通常是特定于平台的.STL和boost不提供与平台无关的包装器,因此您必须依赖其他第三方库.

我过去成功使用过SIGAR:

Sigar API提供了一个便携式界面,用于收集系统信息,例如:

  • 系统内存,交换,CPU,负载平均,正常运行时间,登录
  • 每进程内存,CPU,凭证信息,状态,参数,环境,打开文件
  • 文件系统检测和指标
  • 网络接口检测,配置信息和指标
  • TCP和UDP连接表
  • 网络路由表

作为旁注,Boost Filesystem实际上提供了boost :: filesystem :: space来查询"在某个目录中可以写入多少磁盘空间".


Bri*_*ice 6

确定可用的RAM或硬盘空间量是操作系统级功能.因为有许多不同的策略可以解决这些问题,所以没有独立于平台的方法来获取这些信息.您正在开发的任何操作系统的API都应提供确定这些值的功能.

例如,Windows API似乎提供此功能:http: //msdn.microsoft.com/en-us/library/windows/desktop/aa366589%28v=vs.85%29.aspx ,它可以帮助您确定如何可用的物理/虚拟内存很多.

确定可用的缓存空间量是另一回事,以下答案可能对您有所帮助:https: //stackoverflow.com/a/12838695/3798126