(一)看例子讲sizeof
#include <iostream>
#include <stdio.h>}
注意:
【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