一直都sizeof有点恐惧,老是被折磨的七荤八素的,感觉最近脑袋有点浆糊了。再次狠下心来,花了一个下午研究了一下sizeof的用法。sizeof那些基本用法就不啰唆了,网上一搜一大把,单纯讲讲自己的学习心得。
首先讲一下sizeof(对象)吧,大家都知道sizeof一个空对象(没有任何成员)结果是1,但有没有想过假如这个对象没有成员变量,但有成员函数呢?这样的对象sizeof出来结果又是什么呢?假如你不知道或者不肯定就赶快弄个例子测试一下吧。下面我定义一个例子:
class test
{
void output()
{}
};
上面这个类sizeof出来是多少呢?结果仍是1。先别骂我,还有下文。我再定义一个例子:
class test
{
virtual void output()
{}
};
这个类sizeof出来的结果是多少呢?答案是4.为什么呢?因为这个类多了一个指向虚函数表的指针,也就是说它多了一个指针,但因为不能明眼看到。这个也是sizeof的一个陷阱,也说明学习要注意细节。
接下来说说sizeof的对齐问题吧,这也是sizeof的一个难点,再来这里我栽了几次跟头。先看看下面这个结构体吧:
struct s1
{
int i;
double j;
char c;
int k;
};//sizeof(s1)=?
答案是24,这个结果相信不用细说,大家都算出来了。那么接下来这个这个结构体呢:
struct s2
{
int i;
char c;
double j;
int k;
};//sizeof(s2) = ?
答案依然是24。有点疑问吧?其实也没什么,因为人家要跟最大变量对齐,仅此而已,所以就算后面四个用不上,人家也要占个位。接下来这个这个结构体:
struct s3
{
char c1;
char c2;
double j;
int n;
};//sizeof(s3) =?
答案还是24,也是上面那个原因。再来看看这个下面这个结构体:
struct s4
{
double j;
char c1;
char c2;
int n;
};//sizeof(s4) = ?
这个答案不再是24了,而是16,为什么呢?因为double的对齐方式8,char的对齐方式是1,int的对齐方式是4,现在明白了吗?
以上是今天下午研究sizeof所得体会。如若不足或者不对的地方,还望各位拍拍砖。