一,局部静态对象的构造和析构
如果我们不调用 静态对象 实例化的函数,则不会触发 静态对象的构造函数
局部静态对象,内存地址是在编译期间就确定好的,且会将内存初始化为0.
局部静态对象只会被构造一次。
局部静态对象的析构是在main函数结束后才会调用。(前提是 静态局部对象被构造过)。
class Teacher33 {
public:Teacher33(int age):mage(age) {cout << "Teacher33 的构造函数调用 mage = " << mage << endl;}~Teacher33() {cout << "Teacher33 的析构函数调用" << endl;}int mage;
};void teacher33static(int num) {static Teacher33 tea(num);cout << tea.mage << endl;
}
void main() {{teacher33static(88);teacher33static(99);//第二次调用的时候,不会在teacher33static内部调用teacher33的构造方法}cout << "断点在这里" << endl;
}
Teacher33 的构造函数调用 mage = 88
88
88
断点在这里
Teacher33 的析构函数调用
二.局部静态对象数组的内存分配
和静态对象一样,具有如下的特点:
如果我们不调用 静态对象 实例化的函数,则不会触发 静态对象的构造函数
局部静态对象,内存地址是在编译期间就确定好的,且会将内存初始化为0.
局部静态对象只会被构造一次。
局部静态对象的析构是在main函数结束后才会调用。(前提是 静态局部对象被构造过)。
不同的是:当你的这个数组很大的时候,编译器做了优化。具体怎么优化的不知道,但是肯定做了优化,那么怎么肯定是做了优化呢?如下的例子,可以说明:
void teacher33static2() {static Teacher33 tea[10000000];
}
void main() {teacher33static2();cout << "断点在这里" << endl;
}
按照我们普通理解 数组,那么数组的内存分配一般来说是连续的,也就是说,这个程序如果运行起来,至少有 10000000xsizeof(Teacher33) 的大小,但是实际上,当我们运行起来的时候,查看内存管理器,会看到,实际上只有很小的内存。
但是如果我们将 代码改动一下,让其使用了每一个对象,那么就没有办法优化了。运行起来后,查看内存管理器,会看到,占用的内存就变得较大。
void teacher33static2() {static Teacher33 tea[10000000];for (int i = 0; i < 10000000; i++) {tea[i].mage = i;}
}