C++中的位域(bit-filed):一种节省空间的成员
2017-02-22 10:14
363 查看
有一种被称为位域(bit-field) 的特殊的类数据成员,它可以被声明用来存放特定数目的位。位域必须是有序数据类型。它可以有符号也可以无符号。例如:
class File
{
//
unsigned int modified : 1; // 位域 (bit-field)
};
位域标识符后面跟有一个冒号,然后是一个常量表达式指定位数。例如modified 是一个只有一位构成的位域。
在类体中相邻定义的位域,如果可能的话,它们会被放在同一个整数的连续位中,并以此提供空间压缩。例如,在下列声明中5 个位域被存储在单个unsigned int 中,它首先与位域mode 相关联。
typedef unsigned int Bit;
class File
{
public:
Bit mode: 2;
Bit modified: 1;
Bit prot_owner: 3;
Bit prot_group: 3;
Bit prot_world: 3;
//
};
位域在内存中的位置是从低位向高位放置的,比如mode在Bit的最低两位(二进制数0b0000000000000011中两个1的位置)。
对于位域的访问方式与其他类数据成员相同。例如,类的私有位域只能在类的成员函数和友元中被访问:
void File::write()
{
modified = 1;
//
}
void File::close()
{
if ( modified )
//
内容从略
}
下面的例子说明了怎样使用大于1 位的位域
enum
{ READ = 01, WRITE = 02 }; // 文件模式
int main()
{
File myFile;
myFile.mode |= READ;
if ( myFile.mode & READ )
cout << "myFile.mode is set to READ\n";
}
通常情况下我们会定义一组inline 成员函数,来测试每个位域成员的值。例如,类File可以定义成员isRead()和isWrite()
inline int File::isRead()
{ return mode & READ; }
inline int File::isWrite()
{ return mode & WRITE; }
if ( myFile.isRead() ) /**//*
*/
有了这些成员函数,现在位域可以被声明为类File 的私有成员。
由于取地址操作符& 不能被应用在位域上,所以也没有能指向类的位域的指针。位域也不能是类的静态成员。
C++标准库提供了一个bitset 类模板,它可以辅助操纵位的集合。在可能的情况下应尽可能使用它来取代位域。
class File
{
//
unsigned int modified : 1; // 位域 (bit-field)
};
位域标识符后面跟有一个冒号,然后是一个常量表达式指定位数。例如modified 是一个只有一位构成的位域。
在类体中相邻定义的位域,如果可能的话,它们会被放在同一个整数的连续位中,并以此提供空间压缩。例如,在下列声明中5 个位域被存储在单个unsigned int 中,它首先与位域mode 相关联。
typedef unsigned int Bit;
class File
{
public:
Bit mode: 2;
Bit modified: 1;
Bit prot_owner: 3;
Bit prot_group: 3;
Bit prot_world: 3;
//
};
位域在内存中的位置是从低位向高位放置的,比如mode在Bit的最低两位(二进制数0b0000000000000011中两个1的位置)。
对于位域的访问方式与其他类数据成员相同。例如,类的私有位域只能在类的成员函数和友元中被访问:
void File::write()
{
modified = 1;
//
}
void File::close()
{
if ( modified )
//
内容从略
}
下面的例子说明了怎样使用大于1 位的位域
enum
{ READ = 01, WRITE = 02 }; // 文件模式
int main()
{
File myFile;
myFile.mode |= READ;
if ( myFile.mode & READ )
cout << "myFile.mode is set to READ\n";
}
通常情况下我们会定义一组inline 成员函数,来测试每个位域成员的值。例如,类File可以定义成员isRead()和isWrite()
inline int File::isRead()
{ return mode & READ; }
inline int File::isWrite()
{ return mode & WRITE; }
if ( myFile.isRead() ) /**//*
*/
有了这些成员函数,现在位域可以被声明为类File 的私有成员。
由于取地址操作符& 不能被应用在位域上,所以也没有能指向类的位域的指针。位域也不能是类的静态成员。
C++标准库提供了一个bitset 类模板,它可以辅助操纵位的集合。在可能的情况下应尽可能使用它来取代位域。
相关文章推荐
- C++中的位域(bit-filed):一种节省空间的成员
- C++中的位域(bit-filed):一种节省空间的成员
- 位域(bit-field):一种压缩空间的成员
- 19.6 union一种节省空间的类--使用类管理union成员
- C++中 没有数据成员的类的对象所占的内存空间大小问题
- C++中的类所占内存空间+继承中的成员访问控制
- 一种节省空间的交换变量的基本算法
- c++ 位域(Bit Fields)
- C/C++ 位域(Bit Fields)
- 在c++中的bit field位域
- C++ 学习笔记(19)new/delete表达式、定位new、typeid、dynamic_cast、type_info、枚举类型、成员函数指针、union、位域、volatile限定符、链接指示
- c++ 类中的成员函数在内存空间的分配问题
- C++ 类静态成员的命名空间问题
- 应用C++特性提高执行速度及节省内存空间(1)
- c c++ 中 结构体内成员 位域的 一点经验【2013.10.11小记】
- 关于位域如何节省内存(C++)
- C++防灾——为指针成员分配专门的存储空间
- 使用类成员函数指针调用C++成员函数的一种方式
- C++第4周项目5 - 数组作数据成员(扩展1动态开辟空间)
- C++中数据成员,对象的内存空间