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

时间:2014-07-07 18:35:43

标签: c++ c++11 computer-architecture c++14

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

我希望通过)标准获得答案,但TR2或提案也会很好。

4 个答案:

答案 0 :(得分:21)

  

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

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

它告诉你可用内核数量的唯一原因是因为否则它的多线程模型将会接近无用,即便如此,它也会以抽象方式实现(“硬件并发”不是“物理CPU数量”)在你的台式电脑“)。

答案 1 :(得分:17)

  

" std::thread::hardware_concurrency()为您提供机器支持的线程数..."

不,它没有。准确地说(citing from here

  

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

最好的做法是告诉您,有多少CPU内核可供实际并行执行线程使用(参见@Lightness Races in Orbit's answer here)。 您仍然可以拥有所需数量的线程实例,直到获取一个失败。


  

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

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

  

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

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

  

" ...或者有多少二级缓存可用"

...甚至更少关于如此高度MCU特定性状 1 的概念。

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

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


以上都说:

<cstddef>, <limits> and <type_traits>恕我直言,std::thread支持使用当前标准要求一些机器架构的基本特征和功能。

虽然最新的标准定义采用了一些常见的&#39;最先进的技术和抽象技术(例如std::chronofilesystem experimental library或{ {3}})。

答案 2 :(得分:7)

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

我过去成功使用过SIGAR

  

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

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

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

答案 3 :(得分: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