中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > C/C++
中软一道面试题的解析
作者:未知 时间:2005-09-13 23:27 出处:Blog.ChinaUnix.net 责编:chinaitpower
              摘要:中软一道面试题的解析

这道题解题的关键在于了解类存分配机制以及虚函数的在类中的存储.

需要明白的几个机制:

1.  I386cpu采用小端机制,小端的cpu存储0x12345678时看起来会是 78 56 34 12 ,看起来有点费劲。            

2.  I386的堆栈是由高往低生长的,也即堆栈地址寄存器是自减的。在函数体内,先定义的变量将在高地址位,后定义的变量在低地址位。

中软一道面试题的解析

题目如下

 

#include "stdafx.h"

 

class A

{

public:

       virtual void fun();

};

void A::fun()

{

       printf("output A");

       return;

}

 

class B : A

{

public:

       virtual void fun();//此处定义了虚函数,比较关键

       B(int,char);

       int  a;

       char b;

       void funtion(){}

};

B::B(int a1,char b1)

{

       a = a1;

       b = b1;

}

void B::fun()

{

       printf("output B");

    return;

}

 

int main()

{

       B test(257,'y');

       B *p;

       p = &test;

       char ch = *((char *)p + 5);

       printf("%c\n",ch);

       int size_B = sizeof(B);

       printf("%d\n",size_B);

       return 0;

}

 

 

 

 

 

这道题解题的关键在于了解类存分配机制以及虚函数的在类中的存储.

需要明白的几个机制:

1.  I386cpu采用小端机制,小端的cpu存储0x12345678时看起来会是 78 56 34 12 ,看起来有点费劲。            

2.  I386的堆栈是由高往低生长的,也即堆栈地址寄存器是自减的。在函数体内,先定义的变量将在高地址位,后定义的变量在低地址位。

 

内存块模拟:

地址

指针P内存位置

Class B的实例test占用的内存图

地址

0x04

0x05

0x06

0x07

0x08

0x09

0x0a

0x0b

0x0c

0x0d

0x0e

0x0f

0x10

0x11

0x12

0x13

变量

 

 

 

 

虚函数地址

Test.b

Test.a

 

 

 

内存

0x08

0x00

0x00

0x00

Ff

78

98

00

01

01

00

00

79

Cc

Cc

Cc

 

从上图来分析,(char )p + 5 的即是 0x00000008+5*(sizeof(char)) = 0x0000000d, 而里面的值是0x01.ch的值是 0x01

类里面的普通函数是不会影响类的大小的,即使类里有多个普通函数定义,用sizeof计算,它的大小都不会变化,但虚函数不同,定义在类里的虚函数需要占用4个字节,这四个字节是用来存放虚函数表的入口地址的,即使在类里定义了多个虚函数,同样也只需要4个字节。

 

 

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有