• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

中软一道面试题的解析

发布: 2007-5-26 22:39 | 作者: 未知 | 来源: Blog.ChinaUnix.net | 查看: 71次 | 进入软件测试论坛讨论

领测软件测试网

MILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这道题解题的关键在于了解类存分配机制以及虚函数的在类中的存储.

需要明白的几个机制:

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个字节。

 

 

延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网