c/c++ struct按位分配成员

205 views

一个普通的c/c++中的struct如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct A
{
int d1;
int d2;
int d3;
int d4;
bool b1;
bool b2;
bool b3;
bool b4;
bool b5;
bool b6;
bool b7;
bool b8;
};

如果这里有一个大数组,如100万个A结构数组,肯定会想节省内存的。数据结构在固定的时候,还有什么办法吗?当然有了,就是按位分配成员。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct A
{
int d1;
int d2;
int d3;
int d4;
bool b1:1;
bool b2:1;
bool b3:1;
bool b4:1;
bool b5:1;
bool b6:1;
bool b7:1;
bool b8:1;
};

在成员名后面添加冒号和数字,就代表这个成员占用多少bit位。这样原来的一个bool是占一个字节8bit位的,现在就只占了1bit位了,而8个bool才占一个字节,是不是节省了N多内存了呢。
bool完全可以这么做的原因,是因为bool只有两个值true(1)、false(0),一个bit位完全可以表示并不失真。当然,任意类型在语法上都是可以这么指定位的。如d1、d2你明显知道取值是在0-1000以内,用short都太浪费,用char又不足。那么就可以分配11个bit位(高位符号位,也可以用unsigned d1:10),以次类推。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct A
{
int d1:11;
int d2:11;
int d3;
int d4;
bool b1:1;
bool b2:1;
bool b3:1;
bool b4:1;
bool b5:1;
bool b6:1;
bool b7:1;
bool b8:1;
};

这么做优点很明显了,节省内存,尤其是在大数组的情况下,可以节省很多。唯一不确定的是,大家都知道有一个struct内存对齐的东东。

发表评论

电子邮件地址不会被公开。 必填项已用*标注