• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    中軟一道面試題的解析

    發布: 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個字節。

     

     

    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/


    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備10010545號-5
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>