我写了一个简单的计时器函数来计算start和之间经过的时间end
double mytimer(struct timeval *start, struct timeval *end)
{
return (end->tv_sec - start->tv_sec) + (end->tv_usec - start->tv_usec)*1e-6;
}
Run Code Online (Sandbox Code Playgroud)
gcc给出以下警告:
警告:从'__suseconds_t'转换为'double'可能会改变其值
警告:从'__time_t'转换为'double'可能会改变其值
以下是timeval的定义:
struct timeval {
time_t tv_sec; /* seconds */
suseconds_t tv_usec; /* microseconds */
};
Run Code Online (Sandbox Code Playgroud)
所以我的问题是为什么C定义了这么多不兼容的类型而不是简单地使用原始类型如int short...?它根本不是用户友好的.
我如何对这些类型进行算术运算?
大多数人似乎忽略了我的第二个问题.什么是添加两种不同的类型,如标准的方式time_t和suseconds_t?
因为time_t包含的内容是实现定义的,所以没有什么可以说它们应该包含一个整数秒,就像代码中的注释所暗示的那样.原因是他们希望这些类型在不同系统之间可移植.
在实践中,time.h确实相当麻烦,因此大多数时候程序最终会调用系统特定的功能.
正如 Buttiful Butterfly 正确指出的那样,C++ 语言和标准库设计的目的是在编译时强制逻辑正确性。
这意味着我们的目标是这样一种情况:在某些模糊的情况下会做错误事情的程序根本不会编译(或者会编译,但会警告您)。
这意味着您可以在软件在测试工具中运行之前修复这些逻辑错误,更不用说在客户面前了。
这样做的结果是,正确编写的 C++ 代码在运行时之前基本上可以被证明是“正确的”,这意味着您花在追踪晦涩错误上的时间要少得多。
C++ 的神奇之处在于,它能够实现这一令人难以置信的壮举,同时提供出色的效率和代码优化。
注意:“正确”是指它会可靠地执行您认为您告诉它执行的操作。仍然由您来编写正确的逻辑!
关于问题:
它们不兼容是为了故意阻止您将它们相互转换。它们代表不同的概念,就像速度和距离是不同的概念一样。它们之间没有直接的转换。
使算术的中间结果可以被这些类型安全地转换成,而不会损失精度。在这种情况下,tv_sec 和 tv_usec 是整型,因此即使它们彼此不兼容,它们都可以单独转换为 double。
例如:
double mytimer(struct timeval *start, struct timeval *end)
{
return double(end->tv_sec - start->tv_sec) +
double(end->tv_usec - start->tv_usec) * 1e-6;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
948 次 |
| 最近记录: |