繁体   English   中英

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

[英]Changing type of 32-bit variable to 64-bit variable?

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

该应用程序定义了许多已声明为的计数器

unsigned int call_count;

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

unsigned long long int call_count;

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

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

您的代码是否假设递增32位变量是原子操作? 除非您全力以赴,否则在32位CPU上增加64位变量可能不是原子操作。

例:

  1. call_count时, call_count等于0x00000005FFFFFFFF
  2. call_count的下半部分递增: call_count设置为0x000000500000000 ,CPU的进位位设置为1。
  3. call_count的上半部分增加一个进位: call_count设置为0x0000000600000000

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

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

我怀疑至少在您使用64位处理器的情况下会出现性能问题,因为该变量几乎始终位于缓存中。

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

你应该没事的。

我假设(从pSOS)您正在编码到Moto 68000,它是32位处理器; 在那里使用64位数字会稍微慢一些,因为它需要更多指令(例如,加,校验进位,分支或加到高位字),但我怀疑您担心四周期成本。 如果您使用的是64位处理器,则64位运算与32位运算一样快。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM