一直以来学习C++都没能在内存上多加注意,总以为自己能够写出些能运行的代码就可以了,殊不知这些基础知识的缺失才是以后提高自己能力最大的障碍。之前面试的时候也是在内存的使用上丢了不少分。
先说说C++中几个重要的数据结构:struct、union和enum;
有两篇不错的文章讲述了这几个结构的异同:http://www.cnblogs.com/ggjucheng/archive/2011/12/13/2287009.html
http://blog.sina.com.cn/s/blog_74a459380101avvb.html
struct占用空间的计算需要考虑内存对齐,内存对齐指的就是同一个结构体中存储的数据是分块存储的,每一块的大小是当前结构体数据中最大的那一个所占内存,例如定义
struct test{
bool s1;
int s2;
bool s3;
}
test a;
其中最大的为int 型,占4个字节,则前面和后面的bool型虽然只占用1个字节,但是在存储的时候会占用4字节;因此 a占用的字节空间为 12字节;
而
struct test2{
bool s1;
bool s2;
int s3;
}
test2 b;
前面的两个bool型占不满4个字节,后面的int型占用4个字节;因此b占用的字节空间为8字节;
而联合体union则不需要考虑内存对齐,union中的数据存储空间按照联合体中的最大数据类型来算,
union test3{
int s1;
double s2;
};
test3 c;
c的大小为8;
而枚举enum则只有在赋值的时候数据才会占用空间,大小为4个字节。