将32位变量的类型更改为64位变量?

时间:2009-01-22 17:47:41

标签: c

我的应用程序在pSOS操作系统上运行。代码是用Diab C编译器编译的。

应用程序定义了许多已声明为

的计数器
unsigned int call_count;

由于在一小段时间内有可能出现其中一些溢出,我决定将计数器声明为

unsigned long long int call_count;

我认为这至少在我的一生中不会溢出。

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

4 个答案:

答案 0 :(得分:2)

您的代码是否假设递增32位变量是原子操作?在32位CPU上增加64位变量可能不会是原子的,除非你不遗余力地做到这一点。

示例:

    来电时,
  1. call_count等于0x00000005FFFFFFFF
  2. call_count的下半部分递增:call_count设置为0x000000500000000,CPU的进位设置为1.
  3. call_count的上半部分由进位位递增:call_count设置为0x0000000600000000
  4. 如果另一个线程或中断处理程序在步骤2和3之间读取call_count的值,则会得到错误的结果(0x000000500000000而不是0x000000600000000)。解决方案是同步对call_count的访问。一些可能性:

    • 禁用中断(如果适用)
    • 使用锁定序列化访问
    • 使用原子/互锁函数进行读写(例如:Windows上的InterlockedIncrement()

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

你应该没事。

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

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