今天去了创新面试。
给我题的MM明显对我极度不爽,我不知道我哪里得罪了她,可能因为我迟到了几分钟?可能因为我头发有点乱?还是因为我长得不帅?
在另一个公司试用期,然后跑出来去面试的。- -。毕业,我对国际性大企业异常向往。但现实再次明显的告诉我,我写简历表述自己的功夫可以了,但技术明显还是不过关的。没办法,谁让自己的大学如此荒废,只有现在慢慢再学了。
今天了笔试就考了sizeof,慢慢来看看sizeof。
先来一个最基础的例子。
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
struct{
short a1;
short a2;
short a3;
}A;
struct{
long a1;
short a2;
}B;
int main()
{
char* ss1="0123456789";
char ss2[]="0123456789";
char ss3[100]="0123456789";
int ss4[100];
char q1[]="abc";
char q2[]="a/n";
char* q3="a/n";
char *str1=(char *)malloc(100);
void *str2=(void *)malloc(100);
cout<<sizeof(ss1)<<" ";//ss1为指针,指针为定长4
cout<<sizeof(ss2)<<" ";//ss2初始没有定义长度,但被后面的值填充,而且最后有一个隐含的"/0",
//所以为11
cout<<sizeof(ss3)<<" ";//ss3已经预分配了100,实际上只能存储99个数,隐含"/0",长度仍为100
cout<<sizeof(ss4)<<" ";//400
cout<<sizeof(q1)<<" ";//4
cout<<sizeof(q2)<<" ";//3
cout<<sizeof(q3)<<" ";//4
//A和B是两个结构体.
//在默认情况下,为了方便对结构体内元素的访问和管理,
//1.当结构体内的元素的长度都小于处理器的位数的时候,便以结构体里面最长的数据元素为对齐单位,
// 也就是说,结构体的长度一定是最长的数据元素的整数倍.
//2.如果结构体内存在长度大于处理器位数的元素,那么就以处理器的位数为对齐单位.
// 但是结构体内类型相同的连续元素将在连续的空间内,和数组一样.
cout<<sizeof(A)<<" ";//6
cout<<sizeof(B)<<" ";//长度会根据长的对齐,8
cout<<sizeof(str1)<<" ";//4
cout<<sizeof(str2)<<" ";//无论指针指向数据类型,指针本身长度为4
system("pause");
return 0;
}
看了上面的内容,就会知道sizeof的主要考点,即数据对齐,那么,何为数据对齐呢?
数据对齐,是指数据所在的内存地址必须是该数据长度的整数倍。
上题中的结构体B,long为4个字节,short为两个字节,4+2=6,然后按照4和2中的较大者4的倍数,取8。即完成了数据对齐。
再来看一个简单的例子,主要说类的sizeof
#include <iostream>
using namespace std;
class A{
};
class A2{
char d,e;
};
struct B{
};
struct C{
char b,c;
};
struct D{
int x,y;
};
int main()
{
//对于一个类而言,即使它是一个空的类,编译器仍然要给它一个空间,所以类A即便什么都没有,
//它的空间大小仍然是1.
cout<<sizeof(A)<<endl; //1
cout<<sizeof(A2)<<endl;//2
A *p1=new A();
A p2;
A *p3;
cout<<sizeof(p1)<<endl;//4,指针
cout<<sizeof(p2)<<endl;//1
cout<<sizeof(p3)<<endl;//4,指针
cout<<sizeof(B)<<endl; //1
cout<<sizeof(C)<<endl; //2
cout<<sizeof(D)<<endl; //8
system("pause");
return 0;
}
再来看一个简单的例子,有static的计算sizeof
#include <iostream>
using namespace std;
class A1
{
public:
int a;
static int b;
A1();
~A1();
};
class A2
{
public:
int a;
char c;
A2();
~A2();
};
class A3
{
public:
float a;
char c;
A3();
~A3();
};
class A4
{
public:
float a;
int b;
char c;
A4();
~A4();
};
class A5
{
public:
double d;
float a;
int b;
char c;
A5();
~A5();
};
int main()
{
//静态变量是存放在全局数据区的,而sizeof计算栈中分配的大小,是不会计算在内的
cout<<sizeof(A1)<<endl;//4
cout<<sizeof(A2)<<endl;//8,明显4+1=5,然后对齐到8
cout<<sizeof(A3)<<endl;//8,同上
cout<<sizeof(A4)<<endl;//12,4+4+1=9,对齐到12
cout<<sizeof(A5)<<endl;//24
//由此题得知,无论怎样,对齐后的长度都是最大数据长度元素的整数倍,先用8+4+4+1=17,然后扩展为8*3=24
system("pause");
return 0;
}
ok,static,数据对齐都讨论完了,其实我感觉我对sizeof还是比较熟的吧。。。但今天的笔试题我回想一下是:
class A
{
int i;
DWORD dWord;
A* next;
};
ms是这样的,sizeof(A)是12,我应该是答对了。
这题考了两点我以上几个例子没有涉及到的,1、DWORD,DWORD的使用需引用#include <windows.h>,它占4个字节,WORD占两个字节,2、类里的指针,同样是4个字节。
ok,sizeof暂时就这么多了,然后我们可以看看sizeof与strlen(),size()的异同。