仍然以https://blog.csdn.net/Master_Cui/article/details/109957302中的代码为例
可见直接在构造函数或者析构函数中调用虚函数并不会触发多态机制,函数的地址在编译器就已经确定
二、全局对象的构造和析构
class test
{
public:
test(){
cout << "test::test()缺省构造函数执行了" << endl;
}
~test(){
cout << "test::~test()析构函数执行了" << endl;
}
};
test g_testobj;
int main()
{
cout<<__func__<<endl;
return 0;
}
通过上述代码可见,全局对象的构造在main函数之前,main函数之行结束之后,全局对象被销毁同时调用析构函数
三、局部static数组的内存分配
含有static局部对象的函数无论被调用多少次,static对象的构造函数和析构函数只会被调用一次,如果函数从来没有被调用,那么该static对象从来不会被生成
int main()
{
cout<<__func__<<endl;
while(1);
return 0;
}
上述代码的内存情况如下
再加如下代码
class A
{
public:
int m_i;
};
void myfunc()
{
static A s_aobj[100000];
printf("s_aobj数组的首地址是%p\n", s_aobj);
}
int main()
{
cout<<__func__<<endl;
myfunc();
while(1);
return 0;
}
可见,上面两端程序中的VMRSS的值基本不变,说明即使在一个函数中定义了一个static数组,如果不使用该数组,那么该数组并不会占用内存
接着在myfunc中添加一个for循环
for (int i = 0; i < 100000; i++) {
s_aobj[i].m_i = i;
}
使用了数组后,可见进程所占的内存变大了
参考
《深度探索C++对象模型》
《C++新经典:对象模型》
欢迎大家评论交流,作者水平有限,如有错误,欢迎指出