C++ 学习笔记(四) 关于sizeof的用法

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,虚函数,则会为该类型生成虚函数表,并在该类型的每个实例中添加一个指向虚表的指针。





猜你喜欢

转载自blog.csdn.net/u011310341/article/details/79541929