通信协议知识点04_4.23

1. 题目

        '\101'是合法字符常量,八进制省去了0,"A"不是

        vector、list、map的遍历复杂度都为O(n),map的遍历查找复杂度O(1),用key值找

        枚举类型的都会隐式的转为int值,enum的sizeof是4

        double 8,float 4,int 4,char 1,short 2【32位与64位一致,区别在指针和long】

32位编译器:

      char :1个字节
      char*(即指针变量): 4个字节(32位的寻址空间是2^32, 即32个bit,也就是4个字节。同理64位编译器)
      short int : 2个字节
      int:  4个字节
      unsigned int : 4个字节
      float:  4个字节
      double:   8个字节
      long:   4个字节
      long long:  8个字节
      unsigned long:  4个字节

  64位编译器:

      char :1个字节
      char*(即指针变量): 8个字节
      short int : 2个字节
      int:  4个字节
      unsigned int : 4个字节
      float:  4个字节
      double:   8个字节
      long:   8个字节
      long long:  8个字节
      unsigned long:  8个字节

2. sizeof大小计算

        C++标准规定类的大小不为0,空类的大小为1,当类不包含虚函数和非静态数据成员时,其对象大小也为1。

        虚函数、成员函数[包括静态与非静态]、和静态数据成员都是不占用对象的存储空间的。

        对象大小  =  虚函数指针  +   所有非静态数据成员大小   +   因对齐而多占的字节

        (空的类或只有成员函数的类,大小默认1;只有虚函数占4,其他成员函数不占)

        (对齐原则:总大小是最宽基本类型成员的整数倍

#include <iostream>  
using namespace std;

class A
{
};

class B
{
    char ch;
    void func() {}
};

class C
{
    char ch1;    //占用1字节  
    char ch2;    //占用1字节  
    virtual void func() {}
};

class D
{
    int in;
    virtual void func() {}
};


class Base  
{  
      public:  
             Base(){cout<<"Base-ctor"<<endl;}  
             ~Base(){cout<<"Base-dtor"<<endl;}  
             int a;  
             virtual void f(int) {cout<<"Base::f(int)"<<endl;}  
             virtual void f(double){cout<<"Base::f(double)"<<endl;}  
};  
   
class Derived:public Base  
{  
  public:  
         Derived(){cout<<"Derived-ctor"<<endl;}  
         int b;  
         virtual void g(int){cout<<"Derived::g(int)"<<endl;}  
} // 4int a;   + 4int b;   + 4 虚指针


int main()
{
    A a;
    B b;
    C c;
    D d;
    cout << sizeof(a) << endl;//result=1  
    cout << sizeof(b) << endl;//result=1  
    cout << sizeof(c) << endl;//result=8     
    cout << sizeof(d) << endl;//result=8     
}


        sizeof(指针):在32位计算机中,一个指针变量的返回值必定是4(以字节为单位),在64位系统中指针变量的sizeof结果为8;

        sizeof(数组):数组的sizeof值等于数组所占用的内存字节数【char数组考虑末'\0'】

        sizeof(形参的数组):形参不是数组类型,蜕变为指针,大小为4

        sizeof(结构体):利用偏移量计算

                数据对齐规则,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始;(开始位置:char 1的倍数、int 4的倍数、float 4的倍数、double 8的倍数、short 2的倍数)

                内存对齐规则,结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补齐。

                结构体作为成员:结构体成员要从其内部最大元素大小的整数倍地址开始存储。

        sizeof(union联合体):各个成员共享一段内存,整个联合体的sizeof是每个成员sizeof的最大值。

        sizeof(类):空类的sizeof是1(空类:没有成员的类、类中函数和静态成员不占空间,除非虚函数);

                若类中包含虚函数,则无论有几个虚函数,sizeof类都等于sizeof(数据成员)的和+sizeof(V表指针,为4)【多个虚函数,只占用4】;

                继承时,sizeof(子类) = 子类+父类之和(虚表指针只加一次4);

                虚继承时,sizeof = 子类成员+父类成员+ 一个指向父类指针(4);

                对于既有虚继承又有虚函数的子类:sizeof = 子类成员+父类成员+子类虚表指针4+父类虚表指针4+子类指向父类指针4;【子类和父类虚表指针相同,多态只算一个】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值