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); }
};