一道c/c++面试题的解题思路

今天看了程序员面试宝典,上面有这么一道题,是关于内存中的数据对齐的。

求解下面程序的结果。

#include "stdafx.h"#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,e;A5();~A5();};int main(){cout<<sizeof(A1)<<endl;cout<<sizeof(A2)<<endl;cout<<sizeof(A3)<<endl;cout<<sizeof(A4)<<endl; cout<<sizeof(A5)<<endl;system("pause");return 0;}解析:因为静态变量时存放在全局数据区的,,而sizeof计算栈中分配的大小,是不会计算在内存内的,所以sizeof(A1)是4.

为了照顾数据对齐,int大小为4,char大小为1,所以sizeof(A2)是8.为了照顾数据对齐,float大小为4,char大小为1,所以sizeof(A3)是8.

为了照顾数据对齐,float大小为4,int大小为4,char大小为1,所以sizeof(A4)是12.

为了照顾数据对齐,double大小为8,float大小为4,int大小为4,char大小为1.所以sizeof(A5)是24.

示意图大概为

double(8)

float(4)

int(4)

char(1)

char(1)

注意:VC与GCC中对于double类型的对齐方式不同

Win32平台下的微软VC编译器下任何基本数据T的对齐模数就是T的大小,即sizeof(T)。比如对于double类型(8字节),就要求该类型数据的地址总是8的倍数,而char类型数据(1字节)则可以从任何一个地址开始。

Linux下的GCC则是另一种规则:对于char型数据,其自身对齐值为1,对于short型为2,对于int,float,double类型,其自身对齐值为4,单位字节。

本题是在Win32条件下的结果,故sizeof(A5)的大小需要是8的倍数,取24.

所有欺骗中,自欺是最为严重的

一道c/c++面试题的解题思路

相关文章:

你感兴趣的文章:

标签云: