[英]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位变量可能不是原子操作。
例:
call_count
时, call_count
等于0x00000005FFFFFFFF
。 call_count
的下半部分递增: call_count
设置为0x000000500000000
,CPU的进位位设置为1。 call_count
的上半部分增加一个进位: call_count
设置为0x0000000600000000
。 如果另一个线程或中断处理程序在步骤2和步骤3之间读取了call_count
的值,它将得到错误的结果( 0x000000500000000
而不是0x000000600000000
)。 解决方案是同步对call_count
访问。 一些可能性:
InterlockedIncrement()
) 我怀疑至少在您使用64位处理器的情况下会出现性能问题,因为该变量几乎始终位于缓存中。
在广泛的范围内,这种变化是无害的。 您将需要确保所有访问该值的代码都准备好处理64位数量,并且将需要更改任何格式化其值的代码,但是否则,它应该足够安全-在没有任何值的情况下有关更改可能会破坏的其他代码的信息。
你应该没事的。
我假设(从pSOS)您正在编码到Moto 68000,它是32位处理器; 在那里使用64位数字会稍微慢一些,因为它需要更多指令(例如,加,校验进位,分支或加到高位字),但我怀疑您担心四周期成本。 如果您使用的是64位处理器,则64位运算与32位运算一样快。
这样做当然会增加您的内存存储开销,但是如果您有很多包含这些计数器的结构,那么这同样是一个问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.