例如,如果有一个类需要一个指针和一个bool
. 为简单起见int
,示例中将使用指针,但指针类型无关紧要,只要它指向size()
大于 1 的东西。
使用数据成员定义类{ bool , int *}
将导致类的大小是指针大小的两倍,并浪费大量空间
如果指针不指向 a char
(或 的其他数据size(1)
),那么大概低位将始终为零。该类可以定义为{int *}
或为方便起见:union { int *, uintptr_t }
这bool
是通过根据逻辑bool
值设置/清除指针的低位并在需要使用指针时清除该位来实现的。
定义的方式:
struct myData
{
int * ptr;
bool flag;
};
myData x;
// initialize
x.ptr = new int;
x.flag = false;
// set flag true
x.flag = true;
// set flag false
x.flag = false;
// use ptr
*(x.ptr)=7;
// change ptr
x = y; // y is another int *
以及建议的方式:
union tiny
{
int * ptr;
uintptr_t flag;
};
tiny x;
// initialize
x.ptr = new int;
// set flag true
x.flag |= 1;
// set flag false
x.flag &= ~1;
// use ptr
tiny clean=x; // note that clean will likely be optimized out
clean.flag &= ~1; // back to original value as assigned to ptr
*(clean.ptr)=7;
// change ptr
bool flag=x.flag;
x.ptr = y; // y is another int *
x.flag |= flag;
这似乎是未定义的行为,但它的可移植性如何?