2009-01-22 64 views
0

我的应用程序在pSOS操作系统上运行。代码是用Diab C编译器编译的。将32位变量的类型更改为64位变量?

的应用定义了许多计数器已被宣布为

unsigned int call_count; 

由于存在的一些这些在一个小的时间帧溢出几率,我已宣布该计数器作为

unsigned long long int call_count; 

这我相信至少在我的一生中不会溢出。

我的问题是这种转换无害吗?是否有任何我需要关注的开销。当应用程序处于压力下时,call_count会不断增加。性能会受影响吗? SNMP管理器也会每隔15秒查询一次这些计数器。

+0

如果你只是使用普通的长期,你可以在接下来的几十亿年每秒1000次而不会溢出。 – 2009-01-22 17:51:56

回答

2

你的代码是否假定增加一个32位变量是一个原子操作?在32位CPU上增加一个64位变量可能不会成为原子,除非你想尽办法做到这一点。

例:

  1. call_count等于0x00000005FFFFFFFF,当有电话打进来
  2. call_count下半部递增:call_count被设置为0x000000500000000和CPU的进位被设置为1
  3. call_count的上半部分增加了进位位:call_count设置为0x0000000600000000

如果另一个线程或中断处理程序读取call_count步骤2和3之间的值,它会得到错误的结果(0x000000500000000而不是0x000000600000000)。解决方案是同步访问call_count。有几个可能性:

  • 禁止中断(如适用)
  • 串行访问使用锁
  • 读写使用原子/互锁功能(例如:InterlockedIncrement()在Windows上)
1

我怀疑是否存在性能问题,至少如果您使用64位处理器,因为变量几乎总是在缓存中。

1

在广泛的范围内,变化是无害的。您需要确保访问该值的任何代码已准备好处理64位数量,并且任何格式化其值的代码都需要更改,否则应该足够安全 - 在没有任何代码的情况下有关其他代码的信息将被更改打破。

0

你应该没问题。

我假设(来自pSOS)您正在编码到Moto 68000,它是一个32位处理器;使用64位数字的速度稍慢,因为它需要更多的指令(​​例如,添加,检查进位,分支或添加到高位字),但我怀疑你担心的是四个周期的成本。如果您使用的是64位处理器,那么64位操作系统与32位操作系统一样快。

这样做会增加你的内存存储开销,但如果你有很多包含这些计数器的结构,这只是一个问题。