在uint32中存储自Epoch以来的毫秒是否安全
Is it safe to store milliseconds since Epoch in uint32
我目前正在重写一些旧代码,结果发现:
gettimeofday(&tv, NULL);
unsigned int t = tv.tv_sec * 1000 + tv.tv_usec / 1000;
这看起来真的像是他们试图将Epoch以来的毫秒数存储在uint32中。当然,我认为这不合适,所以我做了一些测试。
#include <sys/time.h>
#include <stdint.h>
int main() {
struct timeval tv;
gettimeofday(&tv, nullptr);
uint32_t t32 = tv.tv_sec * 1000 + tv.tv_usec / 1000;
int64_t t64 = tv.tv_sec * 1000 + tv.tv_usec / 1000;
return 0;
}
我是对的:
(gdb) print t32
$1 = 1730323142
(gdb) print t64
$2 = 1423364498118
所以我想他们所做的是不安全的。但他们在做什么,为什么要这样做,实际发生了什么(在这个例子中,左起10位将丢失,他们只关心diffs)他们仍然保持毫秒精度吗(是)注意,他们通过网络发送这个"时间戳",并且仍然使用它进行计算。
不,它不是"安全的":它牺牲了可移植性、准确性,或者两者兼而有之。
如果你只关心低位,它是可移植的,例如,如果你在网络上发送这些时间,然后在另一边进行查询,最大差值约为400万秒(46天)。
如果您只在int
为64位的系统上运行此代码,那么它是准确的。有一些像那样的机器,但不多。
它更安全吗?我可以回答"不"answers"是"。我说不,因为在这一天,我们几乎使用了自1970年1月以来的所有比特(来自32比特的数字)来说明纪元。当你乘以1000(dec)时,你几乎是把所有的比特向左旋转了大约10比特,这意味着失去了精度。
我也可以答应你的回答。在你的问题结束时,你说这个数字被用来考虑网络中数据包的时间戳。问题是:预计寿命会持续多久?10年?10天10秒?以毫秒为精度丢失10位将给您大量时间在两个精度为毫秒的数据包之间进行计算,我想这就是您想要的
相关文章:
- 通过网络、跨平台传递std::变体是否安全
- 在类型和包装器之间reinterpret_cast是否安全<Type>?
- 跨 DLL 边界访问虚拟方法是否安全/可能?
- 静态 constexpr 类成员变量对多线程读取是否安全?
- 在函数结束后使用指向变量的指针是否安全?
- 逐字节删除 void* 是否安全?
- 在 RAII 构造中修改 RVO 值是否安全?
- 线程调用的函数对对象删除是否安全?
- 将对象的字节复制到数组并再次复制回来是否安全
- 使用枚举为数组编制索引是否安全?
- 返回从字符串文本创建的静态string_view是否安全?
- 在cstlib中将#include_next替换为#include是否安全
- 由并发无序映射查找线程调用的函数是否安全?
- 使用 c++ 原子时编写"y=++x"是否安全?
- 从另一个线程发出信号是否安全?
- 从其存储的回调中删除 std::函数是否安全
- 使用 std::vector::swap 方法在C++中交换两个不同的向量是否安全?
- 当我在C++中调用 struce 的只读静态成员时,线程是否安全
- 同时调用 ASIO 对象的 API 是否安全?
- 使用自己的迭代器分配容器是否安全?