c timeval vs timespec

前端之家收集整理的这篇文章主要介绍了c timeval vs timespec前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
除了精度的差异,struct timeval和struct timespec之间有什么区别?如果我需要的精度低于μs(比如毫秒),为什么我会使用一个而不是另一个?

在我的编译器(ARM的gcc)上:

/* POSIX.1b structure for a time value.  This is like a `struct timeval' but
   has nanoseconds instead of microseconds.  */
struct timespec
  {
    __time_t tv_sec;        /* Seconds.  */
    __syscall_slong_t tv_nsec;  /* Nanoseconds.  */
  };

/* A time value that is accurate to the nearest
   microsecond but also has a range of years.  */
struct timeval
  {
    __time_t tv_sec;        /* Seconds.  */
    __suseconds_t tv_usec;  /* Microseconds.  */
  };

将__syscall_slong_t和__suseconds_t定义为“长字”.

解决方法

我认为这只是API [in]兼容性的问题. POSIX-y调用pselect()clock_gettime()使用struct timespec.各种文件系统调用utimes(),以及一些类似Linux调用,如 gettimeofday()select(),使用struct timeval.从一些手册页大致概括,我怀疑struct timeval有BSD遗留,而struct timespec是POSIX.

如果您正在进行间隔测量,则没有理由不利用clock_gettime()的额外精度 – 尽管要注意它通常是硬件,而不是头文件,这会限制您的测量精度.为显示目的除以一百万不是更好或更差,而不是一千.另外,Mac OS X does not support clock_gettime().

但是如果你正在进行大量的文件时间操作,那么使用像utimes()这样的API中使用的struct timeval可能更有意义. struct timeval在Linux,BSD和Mac OS X上也有一些比较功能,例如: timercmp(),timersub()(再次参见手册页).

我会根据您打算使用的API做出决定,而不是根据结构本身做出决定. (或者,如果需要,可以使用转换方法编写包装类.)

猜你在找的C&C++相关文章