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

标签 c

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

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/

相关文章:

c - 在基于 C 的编程难题中调试 switch 语句

c - 使用 FindFirstFileEx 函数递归遍历目录

c - 如何在格式错误的输入中正确使用带循环的 sscanf?

c - 如何从 NSArray 生成 C vector 或数组?

c - 在 C 中写入文件时换行?

c++ - 如何找到当前硬件线程的L3缓存索引和NUMA节点索引

C编程运算符

c - 通过 pthread 库的内存可见性?

c - 如何分配动态内存并在重新分配后重新分配我们如何将中间释放的内存带到一个 block 内存

c - SIGSEGV 是否传送到每个线程?