代码之家  ›  专栏  ›  技术社区  ›  Prabhu. S

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

c
  •  0
  • Prabhu. S  · 技术社区  · 17 年前

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

    应用程序定义了多个计数器,这些计数器已声明为

    unsigned int call_count;
    

    由于其中一些可能会在很短的时间内溢出,我决定将计数器声明为

    unsigned long long int call_count;
    

    我的问题是,这种转换是无害的吗?有什么开销需要我担心吗。当应用程序处于压力下时,call_count将不断递增。表演会受到打击吗?SNMP管理器也将每15秒查询一次这些计数器。

    4 回复  |  直到 17 年前
        1
  •  2
  •   bk1e    17 年前

    你的代码是否假设递增32位变量是一个原子操作?在32位CPU上递增64位变量可能不会是原子性的,除非你竭尽全力做到这一点。

    例子:

    1. call_count 同等的人 0x00000005FFFFFFFF 当电话进来时。
    2. 下半部分 call_count 递增: call_count 设置为 0x000000500000000
    3. 上半部分 call_count 按进位位递增: call_count 设置为 0x0000000600000000

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

    • 禁用中断(如适用)
    • 使用锁序列化访问
    • 使用原子/互锁函数进行读写(示例: InterlockedIncrement() 在Windows上)
        2
  •  1
  •   Mehrdad Afshari    17 年前

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

        3
  •  1
  •   Jonathan Leffler    17 年前

    在广泛的范围内,这种变化是无害的。您需要确保访问该值的任何代码都准备好处理64位的数量,并且格式化其值的任何码都需要更改,但除此之外,它应该足够安全——在没有任何关于其他代码的信息的情况下,这些代码可能会因更改而损坏。

        4
  •  0
  •   Crashworks    17 年前

    你应该没事的。

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