C++ 在C+中的一个字节中填充两个对象+;

C++ 在C+中的一个字节中填充两个对象+;,c++,memory,C++,Memory,类A使用2个字节。但是,由于c绝不意味着获得大于2^7-1的值(如注释中所指定),因此c字节的一位可用于表示布尔值b。差不多 class A { char c; // c represents a value varying from 0 to 2^7-1 (I don't need a bigger range) bool b; // b is a boolean value } A类 { 无符号字符x;//x表示从0到2^7-1的值和布尔值 公众: A(无符号字符c,布尔b)

A
使用2个字节。但是,由于
c
绝不意味着获得大于2^7-1的值(如注释中所指定),因此
c
字节的一位可用于表示布尔值
b
。差不多

class A
{
   char c; // c represents a value varying from 0 to 2^7-1 (I don't need a bigger range)
   bool b; // b is a boolean value
}
A类
{
无符号字符x;//x表示从0到2^7-1的值和布尔值
公众:
A(无符号字符c,布尔b)
{
断言(c=128)返回x-128;否则返回x;
}
bool getB()
{
返回x>=128;
}
};

现在class
A
使用一个字节。我怀疑我想做的可能很平常,可能会有更简单、更快或更标准的解决方案。是否有更好的解决方案将两个对象塞进一个字节?

您可以使用位字段为成员指定特定的位大小

class A
{
    unsigned char x;   // x represents both a value varying from 0 to 2^7-1 and a boolean value

public:
    A(unsigned char c, bool b)
    {
        assert(c <= 127);
        x = c;
        if (b) x += 128;
    }

    unsigned char getC()
    {
        if (x >= 128) return x - 128; else return x;
    }

    bool getB()
    {
        return x >= 128;
    }
};
#包括
结构A{
无符号字符c:7;
布尔b:1;
};
int main(){

std::cout如果您的代码绝对必须在单个8位字段中存储这两个值,请使用掩码:

#include  <iostream>

struct A {
    unsigned char c : 7;
    bool b : 1;
};


int main() {
    std::cout << sizeof(A);
}

显然,使用位字段更简单,但位字段的布局细节取决于实现;不能保证两个加起来8位的字段将存储在一个8位对象中。

只需使用即可。位字段是特定于实现的,当底层类型不同时,某些编译器会“尊重”底层对象(因此“更好”的做法是使用
无符号字符b:1;
)。
struct a {
    unsigned char value;
    unsigned char get_c() const { return value & 0x7F; }
    void set_c(unsigned char c1} {
        value &= 0x80;
        value |= (c1 & 0x7F);
    }
    bool get_b() const { return value & 0x80; }
    void set_b(bool b1) { value &= 0x7F; value |= (b1 ? 0x80 : 0); }
};