1、在32位机器上,指针的大小为4,64位系统上,指针的大小为8
int *p;
cout << "size of pointer: " << sizeof(p) << endl;
输出结果为 4
2、数组的大小,和数组作为形参,退化成指针的情况
(1)数组大小
int a[10];
cout << "size of int array[10]: " << sizeof(a) / sizeof(int) << endl;
输出结果为10
(2)数组退化为指针
int ArraySizeFalse(int array[])
{
return sizeof(array);
}
cout << "array degenerates into a pointer: " << ArraySizeFalse(a) << endl;
输出结果为4
解决方法,传数组的引用,但数组大小需定义。
3、关于空类型,包含虚函数的类型的大小
(1)空类型:不含任何的成员变量和成员函数;和仅包含默认构造默认析构的类
class EmptyClass{
};
class ClassWithConstructor{
public:
ClassWithConstructor(){};
~ClassWithConstructor(){};
};
EmptyClass aa;
cout << "size of an empty class: " << sizeof(aa) << endl;
ClassWithConstructor b;
cout << "size of a class with constructor: " << sizeof(b) << endl;
输出结果都为1.
空类型的实例中不含任何信息,但声明该类型的实例时,它必须在内存中占一定的空间,否则无法使用这些实例。他的内存大小主要由编译器决定,在VS中,为1。实际上空类型编译器会自动添加默认构造函数和默认析构函数,这两种本质上没有什么区别。并且调用构造函数和析构函数只需要知道函数的地址即可,这些函数的地址只与类型相关,与类型的实例无关,不会为实例添加额外的信息。
(2)给析构函数添加virtual关键字
class ClassWithVirtual{
public:
ClassWithVirtual(){};
virtual ~ClassWithVirtual(){};
};
ClassWithVirtual c;
cout << "size of a class with virtual function: " << sizeof(c) << endl;
输出结果为4
因为声明了virtual,虚函数,则会为该类型生成虚函数表,并在该类型的每个实例中添加一个指向虚表的指针。