2015-12-29 2 views
-2

Я работаю со старым кодом во встроенном приложении. Я видел два различных подхода, чтобы установить биты флагов:Определить флаг в 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. Каков наилучший способ использования ЦП?
  3. Что более правильно определять?

Примечание: если есть какой-либо другой хороший подход, я был бы рад узнать больше.

+1

ваши примеры имеют много тонких проблем ... они действительно должны быть исправлены, прежде чем задавать эти вопросы. –

+0

@KarolyHorvath, пожалуйста, скажите мне, где проблемы? –

+0

нет необходимости использовать флаги в вашем примере. Если у вас есть только один флаг, вы можете использовать переменную вместо 4 для сохранения состояния. –

ответ

2

Каков наилучший способ экономии памяти?

Нет никакой разницы: если вам нужно такое же количество бит внутри примитива, оба подхода приведут к использованию того же объема памяти.struct может использовать дополнительную память, если вы используете больше бит, чем подходит в int, хотя: если вам нужно 40 бит в 32-разрядной системе, ваш struct может быть больше пяти байтов.

Каков наилучший способ использования ЦП?

Там не должно быть никакой разницы: нет волшебного способа установки бит в байте, поэтому компилятор сделает код, который делает то же самое, что и ваши макросы.

Что более подходит для определения?

Поскольку битовые поля не дают вам контроля над точными битами, используемыми каждым компонентом, работает только первый подход, когда вы должны обращаться к битам внутри аппаратных регистров в специальных ячейках памяти. Во всех остальных ситуациях решение зависит от вас, в зависимости от стиля кодирования.

3

1. Каков наилучший способ экономии памяти?

Нет единственного наилучшего способа. Это зависит от вашего использования. Если ваше требование заключается в том, чтобы работать в жесткой системе памяти, вы можете использовать следующие способы (или изучить разные способы):

a. Проверьте, чтобы прокладка и выравнивание структуры и ретрансляционный элемент были уменьшены. b. По возможности используйте бит, когда это возможно (как показано в примере).

Или вы можете использовать приложение backchitect для использования меньше памяти.

2- Что является лучшим способом использования ЦП?

Я думаю, что использование ЦП означает, что процессорный цикл для чтения не требуется. Для этого держите структуру в соответствии с их естественной границей заполнения. Для 64-битного элемента он должен быть выровнен с 64-разрядной памятью.

См структура обивка и выравнивание более подробно на http://www.geeksforgeeks.org/structure-member-alignment-padding-and-data-packing/

3- Что более правильно определить?

Независимо от того, какой компилятор является независимым или доступным для всех компиляторов или, по крайней мере, в компиляторах, на которые вы нацеливаетесь.

+0

Спасибо, хороший ответ. –

Смежные вопросы