我们都知道c++中析构函数和构造函数时干嘛的,此时我们对其加上c++11的新特性default看一下,如下1
class A{
A() = default;//构造
~A() = default;//析构
};
class A{
A(){};
};
对于加default
和加{}
在非虚函数下完全不一样,我们先看下面的一个例子,这个例子在C++11标准里面完全合法,在C++的编译器眼里这个class是trivial-type
class A{
public:
int foo;
};
里面没有任何构造函数和析构函数,编译器会自动的生成一个构造函数给这个class,然后在class A实例化后,给这个A对象分配内存包括foo
假设我们给构造函数加上{}
后这个class在C++编译器的眼里就变成User-provided
class A{
public:
A(){};
};
但是我们加上关键字=default
呢?在编译器眼里它也变成trivial-type,
class A{
public:
A() = default;
};
为啥上面的代码也变成 trivial-type? 因为是你告诉编译器去自动生成构造函数 2
一个trivial-type和非trivial class的区别是,前者(trivial-type)只是简单的内存memcpy,而非trivial则不是
举个例子:我们的类中有虚函数,我们知道虚函数在初始化的时候不是分配内存那么简单,他有非常多隐式的初始化操作,比如初始化虚表等等操作,这些在trivial-type里面不会进行,而在user-provided里会进行
假如我们的class里面有虚函数,在初始化的时候假设class是user-provided的那么会初始化虚表等东西,正常一个类假设类中有虚函数在实例化的时候会有自己的虚表,如果这个虚函数是从父类中继承的,那么虚表中这个继承而来的虚函数指向同一个函数地址
对于析构函数也是的,正常user-provided析构函数会清除虚表等东西,但是trivial-type的class只会机械的清除内存