《程序员面试宝典》第6章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";   //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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值