C++对象模型8——构造函数和析构函数中对虚函数的调用、全局对象构造和析构、局部static数组的内存分配
一、构造函数和析构函数中对虚函数的调用
仍然以https://blog.csdn.net/Master_Cui/article/details/109957302中的代码为例
base3构造函数和析构函数的部分汇编代码如下
可见直接在构造函数或者析构函数中调用虚函数并不会触发多态机制,函数的地址在编译器就已经确定
二、全局对象的构造和析构
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++新经典:对象模型》
欢迎大家评论交流,作者水平有限,如有错误,欢迎指出
C++对象模型8——构造函数和析构函数中对虚函数的调用、全局对象构造和析构、局部static数组的内存分配相关推荐
- C++:构造函数和析构函数能否为虚函数
C++:构造函数和析构函数能否为虚函数? 简单回答是:构造函数不能为虚函数,而析构函数可以且常常是虚函数. (1) 构造函数不能为虚函数 让我们来看看大牛C++之父 Bjarne Stroustrup ...
- 不要在构造和析构函数中使用虚函数
前言 本文将讲解一个新手 C++ 程序员经常会犯的错误 - 在构造/析构函数中使用虚函数,并分析错误原因所在以及规避方法. 错误起因 首先,假设我们以一个实现交易的类为父类,然后一个实现买的类,一个实 ...
- 构造函数与析构函数能否为虚函数?
C++C++C++:构造函数和析构函数能否为虚函数? 简单回答是:构造函数不能为虚函数,而析构函数可以且常常是虚函数. 1.构造函数不能为虚函数 让我们来看看大牛C++C++C++之父 BjarneB ...
- C/Cpp / C++ 构造函数和析构函数可以是虚函数吗
答案 构造函数不可以是虚函数,而析构函数可以且常常是虚函数. 原因 1.构造函数不可以是虚函数 当类中声明虚函数时,编译器会在类中生成一个虚函数表,虚函数表是一个存储成员函数指针的数据结构. 虚函数表 ...
- C++中的虚函数(virtual function)
1回顶部 一.简介 虚函数是C++中用于实现多态(polymorphism)的机制.核心理念就是通过基类访问派生类定义的函数.假设我们有下面的类层次: class A { public: virtua ...
- c 语言的虚函数,C 中的虚函数(virtual function)
一.简介 虚函数是C++中用于实现多态(polymorphism)的机制.核心理念就是通过基类访问派生类定义的函数.假设我们有下面的类层次: class Father { public: virtua ...
- effective c++:virtual函数在构造函数和析构函数中的注意事项
effective c++:virtual函数在构造函数和析构函数中的注意事项 如不使用自动生成函数要明确拒绝 对于一个类,如果你没有声明,c++会自动生成一个构造函数,一个析构函数,一个copy构造 ...
- (c++)5.4构造函数和析构函数中调用虚函数
在构造函数和析构函数中调用虚函数时,采用静态联编(他们所调用的虚函数是自己类中定义的函数) 如果在自己类中没有实现这个虚函数,则调用的是基类中的虚函数,绝不会是任何在派生类中重定义的虚函数 //构造函 ...
- C++核心准则C.82:不要在构造函数或析构函数中调用虚函数
C.82: Don't call virtual functions in constructors and destructors C.82:不要在构造函数或析构函数中调用虚函数 Reason(原因 ...
最新文章
- 使用Auto TensorCore CodeGen优化Matmul
- 机器学习算法选择——特征提取
- 自定义ListView【通用】适配器并实现监听控件
- C#3.0 为我们带来什么(5) —— 匿名类型
- python123第三章作业答案_swift playground类似的游戏
- Java中通过ActionEvent判断是哪个按钮
- 数值范围_数值模拟在铸造业中的发展
- 宏定义和内联函数的学习
- 4699元!三星Galaxy A90 5G国行版开启预售 10月25日正式开售
- c# 反射技术杂谈。,
- jsp- el表达式
- python里countsget_Python Pandas Series.get_dtype_counts()用法及代码示例
- 算法:间隔重排序链表Reorder List
- Perl脚本 — 数字IC验证
- 机器视觉之镜头景深概念与计算
- Raucous Rockers
- udacity-谷歌自动驾驶-课程笔记-localization
- C#语法糖(Csharp Syntactic sugar)
- 怎么用wps将pdf转换成html,如何将PDF格式的文件转换成HTML格式
- python筛选出csv满足某条件的行_python之pandas数据筛选和csv操作