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;【子类和父类虚表指针相同,多态只算一个】