gpt4 book ai didi

c - 在c、位域结构或宏集中定义Flag并获取

转载 作者:行者123 更新时间:2023-11-30 19:57:58 27 4
gpt4 key购买 nike

我在嵌入式应用程序中使用旧代码。我看到两种不同的方法来设置标志位:

1-

#define BIT_0       0x1
#define BIT_1 0x2
#define BIT_2 0x4
#define BIT_3 0x8
#define Curr BIT_0
#define Ready BIT_1
#define Sleep BIT_2
#define Wait BIT_3

#define SET_BIT(var,bits) ((var) |= (bits))
#define CLEAR_BIT(var,bits) ((var) &= (~(bits)))

2-

struct PROCESS_FLAG
{
unsigned long Curr :1;
unsigned long Ready :1;
unsigned long Sleep :1;
unsigned long Wait :1;
};

union STATE_FLAG_REG
{
unsigned long All;
struct STATE_FLAG bit;
}

在第一个定义宏来获取和设置标志时,我可以设置任何标志变量,例如unsigned long flag并使用SET_BIT(flag,3)进行设置。

在第二个中,定义了一个位域结构。

我有一个问题:

  1. 节省内存的最佳方法是什么?
  2. 就 CPU 使用率而言,最佳方法是什么?
  3. 定义什么更合适?

注意:如果有其他好的方法,我很乐意了解更多信息。

最佳答案

What is the best way in terms of saving memory?

没有什么区别:如果您在原语中需要相同数量的位数,则两种方法都会导致使用相同数量的内存。如果您使用的位数超出了 int 的容纳范围,则 struct 可能会使用额外的内存:如果您在 32 位系统上需要 40 位,您的 struct 可能大于五个字节。

What is the best way in terms of CPU usage?

那里应该没有区别:没有神奇的方法来设置字节中的位,因此编译器将生成与宏执行相同操作的代码。

What is more proper to define?

由于位字段无法让您控制每个组件使用的确切位,因此当您必须访问特殊内存位置的硬件寄存器内的位时,只有第一种方法才有效。在所有其他情况下,决定取决于您,这是编码风格的问题。

关于c - 在c、位域结构或宏集中定义Flag并获取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34510248/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com