我正在处理自定义类,它包含日期和时间。该课程的主要目标是达到最佳表现。我的目标平台是Linux 目前,我有这样的成员
Year - int
Month - int
Day - int
Hour- int
Min - int
Sec - double (because I need milisecs as well).
我现在想的是将更改类型改为跟随
Year - unsigned short
Month - unsigned char
Day - unsigned char
Hour- unsigned char
Min - unsigned char
Sec - unsigned char
Milisec - unsigned short
这给了我2 + 1 + 1 + 1 + 1 + 1 + 2 = 9个字节。 正如你已经猜到的那样,我想让我的班级适合8字节(没有其他成员)。 那么解决它的最佳方法是什么,合并(例如秒和毫秒)并使用位掩码来检索值?它会影响性能吗?如果用户将整数传递给某个setter,那么类型转换会影响性能吗?
先谢谢。
答案 0 :(得分:2)
这里有多种选择。最紧凑的方法是使用整数时间戳。虽然解压缩它需要一些处理。另一种选择是使用C ++位域来更紧密地打包。例如,月只需要4位,第5位,分钟和秒6位。它应该让事情变得有点慢,但只是在理论上。这一切都取决于您拥有的这些日期的数量以及您要对它们执行的处理量和类型。在某些情况下,由于更高的内存吞吐量和更好的缓存利用率,将struct
紧密打包到位域中会增加性能。在其他情况下,位操作可能变得更加昂贵。与表现一样,最好不要猜测,但衡量。
答案 1 :(得分:0)
这里最简单的方法是将一对sec和millisec放入一个int(两个字节)。 你不需要单独的Sec(unsigned char)和Milisec(unsigned short),因为你可以将0到60000之间的数字放入一个无符号短路中。
我们称之为milliSecPack(unsigned short)。
milliSecPack = 60 * Sec + Milisec;
和
Sec = milliSecPack / 1000;
Milisec = milliSecPack % 1000;