(一)看例子讲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"; //4 sizeof(ss1) 指针的大小
char ss2[]="0123456789"; //10+1 字符数组
char ss3[100]="0123456789"; //100
int ss4[100]; //4*100 int 为4字节
char q1[]="abcd"; //5 4+1 (+\n) 注意:strlen(q1)=4,因为它遇到\n就停止计算
char q2[]="a\n"; //2+1
char* q3="a\n"; //4 指针
char *str1=(char *)malloc(100); //4 指针
void *str2=(void *)malloc(100); //4 指针
cout<<sizeof(ss1)<<" ";
cout<<sizeof(ss2)<<" ";
cout<<sizeof(ss3)<<" ";
cout<<sizeof(ss4)<<" ";
cout<<sizeof(q1)<<" ";
cout<<sizeof(q2)<<" ";
cout<<sizeof(q3)<<" ";
cout<<sizeof(A)<<" "; //6 A中三个short ,一个short为2字节,按照注意【1】,各自以2字节对齐,size(A)=6
cout<<sizeof(B)<<" "; //8 B 中long(4字节)、short(2字节) 这时候第一眼感觉是sizeof(B)=6; 但是6不是4的整数倍,补充字节,增到8字节。即sizeof(B)=8
cout<<sizeof(str1)<<" "; //4
cout<<sizeof(str2)<<" "; //4
}
注意:
【1】当结构体内的元素的长度都小于处理器的位数的时候,便以结构体里面最长的数据元素为对其单位,即,结构体的长度一定是最长的数据元素的整数倍
【2】而当结构体内存在长度大于处理器位数的元素,那么就以处理器的位数为对齐单位。
【3】但是结构体类型相同的连续元素将在连续的空间内,和数组一样。
【4】有些编译器把结构体大小设为8字节
(二)如果让你设计编译器,你将怎样解决内存对齐的问题?(待续)
数据对齐:是指数据所在的内存地址必须是该数据长度的整数倍。
(三)数据对齐
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
class B
{
private:
bool m_bTemp; //bool占一个字节
int m_nTemp;
bool m_bTemp2;
};
class C
{
private:
int m_nTemp;
bool m_bTemp;
bool m_bTemp2;
};
int main()
{
cout<<sizeof(B)<<endl; //12 4+4+4
cout<<sizeof(C)<<endl; //8 4+4
}
(四)
#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; //4
char c;
A3();
~A3();
};
class A4
{
public:
float a;
int b;
char c;
A4();
~A4();
};
class A5
{
public:
double d; //8
float a;
int b;
char c;
A5();
~A5();
};
int main()
{
cout<<sizeof(A1)<<endl; //4
cout<<sizeof(A2)<<endl; //8
cout<<sizeof(A3)<<endl; //8
cout<<sizeof(A4)<<endl; //12
cout<<sizeof(A5)<<endl; //24
return 0;
}
这个题:
sizeof(A1)=4,只算了int a;占的内存。static静态变量存在全局数据区的。而sizeof计算栈中分配的大小,static变量不计算在内,所以sizeof(A1)=4;
sizeof(A2)=8 int 4 char 1 => 数据对齐 为8
sizeof(A3)=8 float 4 char 1 => 数据对齐 为8
sizeof(A4)=12 float 4 int 4 char 1 => 数据对齐 为12
sizeof(A45)=24 double 8、 float 4、int 4、 char 1 => 数据对齐 为8+8+8