zoukankan      html  css  js  c++  java
  • 常问面试题:C++中sizeof的陷阱及应答

    C++中sizeof是经常被问到的一个概念,比如,下面的几个关于sizeof的面试题反复出现在各大IT公司的技术面试当中,我们有必要完全理解并掌握。
    注:在曾经面试大公司时,我的确被问到过这样的问题。

    面试题:定义一个的数据类型,里面没有任何成员变量和成员函数,对该类型求sizeof,得到的结果是多少?
    答案:1,为什么不是0?空类型的实例中不包含任何信息,本来求sizeof应该是0,但是当我们声明该类型的实例时,它必须在内存中占有一定的空间,否则无法使用这些实例(也就不能求sizeof了),至于占用多少内存,由编译器决定,Visual Studio中每个空类型的实例占用1字节的空间。
     
    扩展1:如果在该类型中添加一个构造函数和析构函数,再求sizeof,得到的结果是多少?
    答案:还是1。调用构造函数和析构函数只需要知道函数的地址即可,而这些地址只与类型相关,而与类型的实例无关,编译器也不会因为这两个函数而在实例内添加任何额外的信息。
    注:不管添加的是构造函数还是析构函数还是其它任何类型的函数,都是这个结果。
     
    扩展2:那如果把析构函数标记为虚函数呢?
    答案:C++的编译器一旦发现一个类型中有虚函数,就会为该类型生成虚函数表,并在该类型的每一个实例中添加一个指向虚函数表的指针,在32位机器上,一个指针占4字节空间,因此求sizeof得到4;如果是64位则为8
     
    测试用例:
     1 #include <stdio.h>
     2 
     3 struct nullType { };
     4 
     5 struct type1 
     6 {
     7     type1() {}
     8     ~type1() {}
     9     int print() { printf("Alexia"); return 0; }
    10 };
    11 
    12 struct type2 
    13 {
    14     type2() {}
    15     virtual ~type2() {}
    16 };
    17 
    18 int main() 
    19 {
    20     printf("sizeof(nullType) = %d
    ", sizeof(nullType));
    21     printf("sizeof(type1) = %d
    ", sizeof(type1));
    22     printf("sizeof(type2) = %d
    ", sizeof(type2));
    23 
    24     return 0;
    25 }

     注:摘自《剑指offer》



    补充:

    C中,sizeof('a')=4而不是1,因为C语言中的字符常数是int型,因此sizeof('a')是sizeof(int),这是与C++不同的地方。

     
  • 相关阅读:
    并查集
    CCF201604-02
    作业八
    作业七
    数据结构--链队列基本操作
    数据结构--栈的基本操作
    eclipse配置maven
    软件架构
    scala lambda 表达式 & spark RDD函数操作
    spark(3)
  • 原文地址:https://www.cnblogs.com/xymqx/p/4452411.html
Copyright © 2011-2022 走看看