我知道在C ++中,有几种方法可以实现标志,例如std::bitset<>
,bool
和使用uint8_t
这样的整数类型。但是当执行时间或内存受到限制时,在C ++中实现标志的首选方法是什么,例如for(;;)
vs while(1)
我认为使用bool
或char
比std::bitset<>
快,因为std::bitset
不是基本数据类型。
std::bitset<2> flag;
flag.reset(0);
flag.set(1);
if(flag.test(0)){...}
if(!flag.test(1)){...}
//------------------------
bool flag0 = 0;
bool flag1 = 1;
if(flag0){...}
if(!flag1){...}
//------------------------
uint8_t flag = 0b00000010;
if(flag & 0x01){...}
if(!flag & 0x02){...}
在处理
uint8_t
中的标志时,或者在程序执行期间反复使用它们(如玩家的状态效果)时,我会亲自使用struct
;对于短期标志,例如在进行气泡排序时,会重复使用bool
。还有其他更有效或更优选的方法来实现标志吗?
最佳答案
在我的项目中,当我在课堂上有很多布尔值时,我会像这样打包它们。
class A {
//...
struct { //note: unnamed struct
bool bCondA : 1;
bool bCondB : 1;
bool bCondC : 1;
//... and so on...
};
//...
};
void funcA(){
A objA;
if(A.bCondB){
//...
}
else if (A.bCondC){
//...
}
}
您可以像在任何代码中的普通bool成员一样照常使用成员标志/布尔值。编辑将仅在类定义上进行。
如果我想在一个操作中操作多个它们,我可以这样做:
class A {
//...
union { //note: unnamed union
struct { //note: unnamed struct
bool m_bCondA : 1;
bool m_bCondB : 1;
bool m_bCondC : 1;
//... and so on...
};
int m_bAllFlags; //note: you can change int to int8_t or any type that will fit all the flags.
};
void methodX(); //method for testing.
void clearFlags(){ m_bAllFlags = 0; } //clear all flags in 1 swoop.
void clearGroup1Flags(){ m_bAllFlags & ~0b0110101101; }
//...
};
void A::methodX(){
A objA;
objA.m_bCondC = true;
if(objA.m_bCondA){
//...
}
else if (objA.m_bCondA){
//...
}
objA.clearFlags();
}
我不知道优点和缺点的全部清单,但是对我来说很好。