【VC++】虚函数 内存结构 - 第四篇(多重继承,无虚函数覆盖)

c++类大小(涵盖继承 虚继承 虚函数表) 涉及到c++中求类大小时需要特别注意一下几点 1.为类的非静态成员数据的类型大小之和. 2.有编译器额外加入的成员变量的大小,用来支持语言的某些特性(如:指向虚函数的指针、虚继承、多重继承). 3.为了优化存取效率,进行的边缘调整. 4.  与类中的构造函数,析构函数以及其他的成员函数无关.  5.  私有继承,会去继承之前的私有成员变量么? 会...在内存中仍然分配 阅读详情

【VC++】虚函数 内存结构 - 第四篇(多重继承,无虚函数覆盖)

#include <IOSTREAM>
using namespace std;

class Base1
{
public:
	int nBase1;
	int nBase2;
	
	Base1(int n1,int n2):nBase1(n1),nBase2(n2)
	{
		cout<<"Base1::Base1("<<n1<<","<<n2<<")"<<endl;
	}
	
	virtual void F()
	{
		cout<<"Base1::F()"<<endl;
	}
	virtual void G()
	{
		cout<<"Base1::G()"<<endl;
	}
};

class Base2
{
public:
	int nBase1;
	int nBase2;
	
	Base2(int n1,int n2):nBase1(n1),nBase2(n2)
	{
		cout<<"Base2::Base2("<<n1<<","<<n2<<")"<<endl;
	}
	
	virtual void F()
	{
		cout<<"Base2::F()"<<endl;
	}
	virtual void G()
	{
		cout<<"Base2::G()"<<endl;
	}
};

class Derive:public Base1, public Base2
{
public:
	int nBase1;	//与父类成员变量名一样
	int nDerive2;
	
	Derive(int n1,int n2,int n3,int n4,int n5,int n6):Base1(n1,n2),Base2(n3,n4),nBase1(n5),nDerive2(n6)
	{
		cout<<"Derive::Derive("<<n5<<","<<n6<<")"<<endl;
	}
	
	virtual void F2()
	{
		cout<<"Derive::F2()"<<endl;
	}
	virtual void G2()
	{
		cout<<"Derive::G2()"<<endl;
	}
};

typedef void(*Fun)(void);

void TestBase1(Base1 &b)
{
	Fun pFun = NULL;
	int** pVtab = (int**)&b;
	
	cout << "类对象地址 / 虚函数表指针的地址:" << (&b) << " / " << pVtab << endl;
	cout << "虚函数表指针值(虚函数表的地址)(十进制):" << (int)pVtab[0] <<endl;
	cout << "虚函数表指针值(虚函数表的地址)(十六进制):" << pVtab[0] <<endl; 
	
	cout << "虚函数表 — 第 1 个函数地址的地址:"  <<  &pVtab[0][0] << " , ";	//好比一个变量的地址
	cout << "函数地址值:"  << (int*)pVtab[0][0] << " 调:";	//好比一个变量的值(这个值也是个地址)
	pFun = (Fun)pVtab[0][0];
	pFun();
	
	cout << "虚函数表 — 第 2 个函数地址的地址:"  <<  &pVtab[0][1] << " , ";
	cout << "函数地址值:"  << (int*)pVtab[0][1] << " 调:";
	pFun = (Fun)pVtab[0][1];
	pFun();
	
	cout << "虚函数表 — 第 3 个函数地址的地址:"  <<  &pVtab[0][2] << " , ";
	cout << "函数地址值:"  << (int*)pVtab[0][2] <<endl ;	//如果仅有一个虚函数,后面的节点不是NULL???
	//pFun = (Fun)pVtab[0][2];
	//pFun();
	
	cout << "类对象 — 第 1 个变量地址:" << &pVtab[1]  << " 值:"<< (int)pVtab[1] <<endl;	
	cout << "类对象 — 第 2 个变量地址:" << &pVtab[2]  << " 值:"<< (int)pVtab[2] <<endl;
	cout << "类对象 — 第 3 个变量地址:" << &pVtab[3]  << " 值:"<< (int)pVtab[3] <<endl;	//之后的内存是什么???
	
	cout<<endl;
}

void TestBase2(Base2 &b)
{
	Fun pFun = NULL;
	int** pVtab = (int**)&b;
	
	cout << "类对象地址 / 虚函数表指针的地址:" << (&b) << " / " << pVtab << endl;
	cout << "虚函数表指针值(虚函数表的地址)(十进制):" << (int)pVtab[0] <<endl;
	cout << "虚函数表指针值(虚函数表的地址)(十六进制):" << pVtab[0] <<endl; 
	
	cout << "虚函数表 — 第 1 个函数地址的地址:"  <<  &pVtab[0][0] << " , ";	//好比一个变量的地址
	cout << "函数地址值:"  << (int*)pVtab[0][0] << " 调:";	//好比一个变量的值(这个值也是个地址)
	pFun = (Fun)pVtab[0][0];
	pFun();
	
	cout << "虚函数表 — 第 2 个函数地址的地址:"  <<  &pVtab[0][1] << " , ";
	cout << "函数地址值:"  << (int*)pVtab[0][1] << " 调:";
	pFun = (Fun)pVtab[0][1];
	pFun();
	
	cout << "虚函数表 — 第 3 个函数地址的地址:"  <<  &pVtab[0][2] << " , ";
	cout << "函数地址值:"  << (int*)pVtab[0][2] <<endl ;	//如果仅有一个虚函数,后面的节点不是NULL???
	//pFun = (Fun)pVtab[0][2];
	//pFun();
	
	cout << "类对象 — 第 1 个变量地址:" << &pVtab[1]  << " 值:"<< (int)pVtab[1] <<endl;	
	cout << "类对象 — 第 2 个变量地址:" << &pVtab[2]  << " 值:"<< (int)pVtab[2] <<endl;
	cout << "类对象 — 第 3 个变量地址:" << &pVtab[3]  << " 值:"<< (int)pVtab[3] <<endl;	//之后的内存是什么???
	
	cout<<endl;
}

void TestDerive(Derive &d)
{
	Fun pFun = NULL;
	int** pVtab = (int**)&d;
	
	cout << "类对象地址 / 虚函数表指针的地址:" << (&d) << " / " << pVtab << endl;
	cout << "虚函数表指针值(虚函数表的地址)(十进制):" << (int)pVtab[0] <<endl;
	cout << "虚函数表指针值(虚函数表的地址)(十六进制):" << pVtab[0] <<endl; 
	
	cout << "虚函数表 — 第 1 个函数地址的地址:"  <<  &pVtab[0][0] << " , ";	//好比一个变量的地址
	cout << "函数地址值:"  << (int*)pVtab[0][0] << " 调:";	//好比一个变量的值(这个值也是个地址)
	pFun = (Fun)pVtab[0][0];
	pFun();
	
	cout << "虚函数表 — 第 2 个函数地址的地址:"  <<  &pVtab[0][1] << " , ";
	cout << "函数地址值:"  << (int*)pVtab[0][1] << " 调:";
	pFun = (Fun)pVtab[0][1];
	pFun();
	
	cout << "虚函数表 — 第 3 个函数地址的地址:"  <<  &pVtab[0][2] << " , ";
	cout << "函数地址值:"  << (int*)pVtab[0][2] << " 调:";
	pFun = (Fun)pVtab[0][2];
	pFun();
	
	cout << "虚函数表 — 第 4 个函数地址的地址:"  <<  &pVtab[0][3] << " , ";
	cout << "函数地址值:"  << (int*)pVtab[0][3] << " 调:";
	pFun = (Fun)pVtab[0][3];
	pFun();

	cout << "虚函数表 — 第 5 个函数地址的地址:"  <<  &pVtab[0][4] << " , ";
	cout << "函数地址值:"  << (int*)pVtab[0][4] << endl;
	
	cout << "类对象 — 第 1 个变量地址:" << &pVtab[1]  << " 值:"<< (int)pVtab[1] <<endl;	
	cout << "类对象 — 第 2 个变量地址:" << &pVtab[2]  << " 值:"<< (int)pVtab[2] <<endl;
	//cout << "类对象 — 第 3 个变量地址:" << &pVtab[3]  << " 值:"<< (int)pVtab[3] <<endl;

	//////////////////////////////////////////////////////////////////////////第 2 个虚函数表
	cout << "第 2 个虚函数表指针的地址:" << &pVtab[3] << endl;
	cout << "第 2 个虚函数表指针值(虚函数表的地址)(十进制):" << (int)pVtab[3] <<endl;
	cout << "第 2 个虚函数表指针值(虚函数表的地址)(十六进制):" << pVtab[3] <<endl; 
	
	cout << "第 2 个虚函数表 — 第 1 个函数地址的地址:"  <<  &pVtab[3][0] << " , ";	//好比一个变量的地址
	cout << "函数地址值:"  << (int*)pVtab[3][0] << " 调:";	//好比一个变量的值(这个值也是个地址)
	pFun = (Fun)pVtab[3][0];
	pFun();
	
	cout << "第 2 个虚函数表 — 第 2 个函数地址的地址:"  <<  &pVtab[3][1] << " , ";
	cout << "函数地址值:"  << (int*)pVtab[3][1] << " 调:";
	pFun = (Fun)pVtab[3][1];
	pFun();
	
	cout << "第 2 个虚函数表 — 第 3 个函数地址的地址:"  <<  &pVtab[3][2] << " , ";
	cout << "函数地址值:"  << (int*)pVtab[3][2] << endl;
	//////////////////////////////////////////////////////////////////////////	

	cout << "类对象 — 第 3 个变量地址:" << &pVtab[4]  << " 值:"<< (int)pVtab[4] <<endl;
	cout << "类对象 — 第 4 个变量地址:" << &pVtab[5]  << " 值:"<< (int)pVtab[5] <<endl;
	cout << "类对象 — 第 5 个变量地址:" << &pVtab[6]  << " 值:"<< (int)pVtab[6] <<endl;
	cout << "类对象 — 第 6 个变量地址:" << &pVtab[7]  << " 值:"<< (int)pVtab[7] <<endl;
	cout << "类对象 — 第 7 个变量地址:" << &pVtab[8]  << " 值:"<< (int)pVtab[8] <<endl;
	
	cout<<endl;
}

void main()
{
	Base1 b1(123,321);
	Base2 b2(456,654);
	Derive d(111,222,333,444,555,666);
	
	TestBase1(b1);
	TestBase2(b2);
	TestDerive(d);
	
	cout<<"d.nBase1: "<<d.nBase1<<endl;
	cout<<"d.Base1::nBase1: "<<d.Base1::nBase1<<endl;
	cout<<"d.Base2::nBase1: "<<d.Base2::nBase1<<endl;
	
	cout<<endl;
}

运行结果:
在这里插入图片描述
两个父类的对象,各种地址和值的比对(红色表示不同的地方):

在这里插入图片描述
父类对象 与 子类对象 比对,b1 比对 d:

在这里插入图片描述
b2 比对 d:

在这里插入图片描述
类图、监视值(可以看到,VS的监视值并不全面,还是以实际打印的为准):

在这里插入图片描述
在内存中的结构是:
在这里插入图片描述
在本文结束前,我也还是来介绍下自己吧。我从03年初学编程,一直到现在都在做软件开发方面的事,做过VC++、VB/Delphi/C++Builder、C#/Asp.Net、Java、Web前后端、数据库、服务器端、客户端、js、lua、Flash AS、cocos2dx/Unity3d……都有接触过,甚至做过很长一段时间的运营、产品策划、美工、客服、线下推广员、公司经理 多职务……技术只是一种工具,用来实现业务需求,所以最大的特长是逻辑思维、挖掘业务需求、强化用户体验、快速的产品实现,最自以为豪的,我做过的很多产品,很稳定,bug极少(当然也出现过没考虑周全的漏洞在所难免但总体上也还算少),有很多独立开发的游戏运营到现在还在稳定的运行。不是技术极客,而是业务需求带动技术的学习研究,所以也不怎么挑语言,编程语言大体上也都是相通的,底层原理也有很多类同的地方。所以缺点从不敢说精通哪一门语言。遇到小工具、小需求的订制实现,我个人最喜欢的还是用VC6,简洁干净,编译出来的东西 体积小,速度快,占CPU内存小。当然实际工作中,还是随项目。欢迎大家和我交流,我的QQ是:七6.肆-陆_柒-4`7_四.
生活中的我,热爱 街舞、飙车、花式游泳、游戏一条命通关……极限运动,我抖音号(一不小心玩出花样)是:1917940952

对于父类对象的b1、b2在内存中的结构,前面文章已有详细的图示,此文就不再画了。

文章没有考虑字节对齐(都用默认的字节对齐),并且是在32位环境下,VC6、VS2017 都测试过。

	cout<<"sizeof(Base1): "<<sizeof(Base1)<<endl;	
	cout<<"sizeof(Base2): "<<sizeof(Base2)<<endl;
	cout<<"sizeof(Derive): "<<sizeof(Derive)<<endl;	
	/*
	打印结果:
				sizeof(Base1): 12
				sizeof(Base2): 12
				sizeof(Derive): 32
	*/

(转载时请注明作者和出处。未经许可,请勿用于商业用途)
原创出处:https://blog.youkuaiyun.com/maoyeahcom/article/details/108873586

excel 大写数字转换小写数字 vb代码 菜鸟一枚,朋友需要在excel中将大写数字转换为阿拉伯数字,由于是文本格式的,我也不会,就研究用了vb来实现。当时想着复制粘贴,结果网上没找到,于是自己胡写了一些,一般情况测试通过。 这是vb源码。 普通excel用户在表格中输入=lwzh(A1)即可,A1是需要转换的单元格。 由于朋友只需要转换最大几仟万的数字,所以最大支持玖仟玖佰玖拾玖万玖仟玖佰玖拾玖。需要更大数字的同志们,自己改一下吧,很简单。 源码为加密,按alt+F11可以查看。 立即下载

相关推荐

基于OkHttp3+Retrofit2+RxJava3搭建响应式网络框架

本文介绍了一个基于OkHttp3+Retrofit3+RxJava3的响应式网络框架设计。该框架采用分层架构,OkHttp3负责底层网络请求,Retrofit3封装HTTP接口,RxJava3实现响应式流处理。核心亮点包括:1)高度解耦的分层设计;2)统一的异常处理和响应体封装;3)RxJava3实现线程切换和请求管理;4)MVVM架构适配,业务层只需关注数据逻辑。框架提供了完整的实现方案,包括全局配置、拦截器、响应转换、接口声明、仓库封装等组件,并支持生产环境扩展功能如Cookie持久化、Token刷新等

fuge2008的博客 872

用delphi写人民币大写转小写的函数

今天找到一个思路,用分段的方法实现了人民币大写转小写的功能,最大到千亿。

程序员与注册会计师 579

Keil5保姆级安装指南:从破解到STM32开发环境配置(附常见错误解决方案)

本文提供Keil5从安装到STM32开发环境配置的完整指南,包含破解步骤、常见错误解决方案及多芯片支持配置。详细讲解环境预检、核心安装、许可证管理及高效开发环境设置,帮助开发者快速搭建嵌入式开发平台。特别针对安装和卸载过程中的关键问题提供专业解决方案。

weixin_30369041的博客 125

“笨办法”学Python笔记 Lesson18—24

一、作业内容 笨办法学 Python 习题18-24以及加分题。 二、作业代码: # 习题 18:命名、变量、代码、函数 # 知识点总结: # 一、函数可以给代码片段命名,就跟变量和数字命名一样 # 二、它们可以接受参数,就跟你的脚本接受argv一样。 # 三、通过使用#1和#2,它们可以让你创建微型脚本或者小命令。 # this one is like your script...

qq_18893805的博客 2166

UE5新手必看:3种UI定位方法实战(含蓝图配置截图)

本文为UE5新手详细解析了三种核心UI定位方法:屏幕空间、场景空间和世界空间。通过实战蓝图配置与控件操作,指导开发者如何根据HUD、角色血条、3D物体标记等不同应用场景,正确选择并配置UI的定位方式,以实现清晰的信息传递与沉浸式体验。

weixin_29018815的博客 473

基于YOLO26的实时目标追踪实战:从训练到视频追踪(附完整可视化代码)

核心组合:YOLO26(高精度检测)+ ByteTrack(稳定追踪)是实时目标追踪的最优工业组合,Ultralytics内置集成无需额外开发;训练优化:追踪场景需优先提升检测框精度(增加box损失权重),保证ID稳定性;可视化核心:为每个ID分配唯一颜色、绘制运动轨迹、显示FPS,是落地场景的必备功能;性能调优:轻量化模型+降分辨率+OpenVINO导出,可在边缘设备(如研华工控机)实现实时追踪。这套代码可直接复用到智慧园区、停车场、工业产线等场景,仅需修改park.yaml中的类别和。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 573

python语句int_python中的int函数

int函数用来把其他类型向下转换为整数类型int(3.6) --- 3int(3.2) --- 3int(1/3) --- 0int("1") --- 1int()可以按照指定的进制的整数转换为十进制的整数,如果不指定默认是十进制转换为十进制,第二个参数给0和不给一样,除非你自己指定隐含的进制int("3333") --- 3333 (将十进制的3333转化为十进制的数)int("3333",0...

weixin_39756273的博客 707

基于ART算法和SIRT算法的超声CT反演及MATLAB代码实现

在超声CT中,反演算法起着至关重要的作用,它通过从测量数据中恢复出目标物体的内部结构。本文将介绍基于ART算法(Algebraic Reconstruction Technique)和SIRT算法(Simultaneous Iterative Reconstruction Technique)的超声CT反演方法,并提供相应的MATLAB代码实现。本文介绍了基于ART算法和SIRT算法的超声CT反演方法,并提供了相应的MATLAB代码示例。基于ART算法和SIRT算法的超声CT反演及MATLAB代码实现。

2301_79326510的博客 566

15个常用excel函数公式_可直接套用的22个常用Excel函数

Excel曾经一度出现了严重Bug,主要有两种比较悲催的情况,首先是这种:更加悲催的是这种:言归正传,今天和大家分享一组常用函数公式的使用方法:职场人士必须掌握的12个Excel函数,用心掌握这些函数,工作效率就会有质的提升。建议收藏备用着,有时间多学习操练下。目录:数字处理、判断公式、统计公式、求和公式、查找与引用公式、字符串处理公式、其他常用公式等一、数字处理01.取绝对值=ABS(数字)02...

weixin_40001395的博客 2580

【Bug已解决】codex file edit fails / Write operation denied — CodeX CLI 文件编辑失败解决方案

CodeX CLI 编辑文件时报写入被拒绝,本质是沙箱限制或权限不足。文中给出配置允许目录、修复权限、Git stash 管理冲突等完整方案。

一键难忘的博客 4301

Codex入门19-数据库操作(解放双手:用自然语言写SQL、建表和数据迁移)

写 SQL 是后端开发的日常,但复杂的 JOIN、子查询、窗口函数总让人头疼。本文教你用 Codex CLI 实现:自然语言直接生成 CREATE TABLE、复杂 SQL 查询、数据库迁移脚本(Prisma/Knex/Alembic)、ORM 模型代码(SQLAlchemy/TypeORM)、甚至自动生成数据库文档。重点强调安全红线——永远不要让 AI 直接连接生产数据库。从需求描述到完整数据库层代码,一篇搞定。

yueyeguzhuo的专栏 234

如何把大写金额变为小写数字_人民币金额(数字)大小写转换在线工具

人民币金额用到的中文大写汉字如下:零、壹、贰、叁、肆、伍、陆、柒、捌、玖、拾、佰、仟、万、亿。人民币常识人民币(缩写为RMB)是我国大陆地区的法定货币,尽管每个人几乎天天都要接触到人民币或者支票,但是人民币大写如何写是困扰很多人的问题。尽管生活中看起来极其熟悉而又简单的东西,但发现其实并不会写。人民币在ISO 4217简称为CNY(China Yuan),常用简写为RMB(Ren Min Bi);...

weixin_39744894的博客 2765

【笔记篇】Davinci Configurator BswM模块

AUTOSAR BSWM模块配置介绍

weixin_47571898的博客 1534

【VC++】虚函数 内存结构 - 第五篇(多重继承,有虚函数覆盖)

【VC++】虚函数 内存结构 - 第五篇(多重继承,有虚函数覆盖)

maoyeahcom的博客 254

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

C++继承的内存布局

单一继承 可见以下几个方面: 1)虚函数表在最前面的位置。 2)成员变量根据其继承和声明顺序依次放在后面。 3)在单一的继承中,被overwrite的虚函数在虚函数表中得到了更新。 多重继承 我们可以看到: 1) 每个父类都有自己的虚表。 2) 子类的成员函数被放到了第一个父类的表中。 3) 内存布局中,其父类布局依次按声明顺序排列。 4) 每个父类的虚表中的f()函数都被overw...

Waves___的博客 4323

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C++ 对象的内存布局(上)

C++ 对象的内存布局(上) 陈皓http://blog.youkuaiyun.com/haoel  点击这里查看下篇>>>前言 07年12月,我写了一篇《C++虚函数表解析》的文章,引起了大家的兴趣。有很多朋友对我的文章留了言,有鼓励我的,有批评我的,还有很多问问题的。我在这里一并对大家的留言表示感谢。这也是我为什么再写一篇续言的原因。因为,在上一篇文章中,我用了的示例都是非

陈皓专栏 【空谷幽兰,心如皓月】 17万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

VC_VC++类继承内存布局

上看到了一篇写得非常好的文章,是有关c++类继承内存布局的。看了之后获益良多,现在转在我自己的博客里面,作为以后复习之用。 ——谈VC++对象模型 (美)简.格雷 程化    译 译者前言 一个C++程序员,想要进一步提升技术水平的话,应该多了解一些语言的语意细节。对于使用VC++的程序员来说,还应该了解一些VC++对于C++的诠释。 Inside the C++ Object

优快云-MarkYang 2541

c++继承中的内存布局

 今天在网上看到了一篇写得非常好的文章,是有关c++类继承内存布局的。看了之后获益良多,现在转在我自己的博客里面,作为以后复习之用。 ——谈VC++对象模型(美)简.格雷程化    译 译者前言 一个C++程序员,想要进一步提升技术水平的话,应该多了解一些语言的语意细节。对于使用VC++的程序员来说,还应该了解一些VC++对于C++的诠释。 Inside the C++ Object

cesc 1万+

多重继承的内存分配

VC++,掀起你的盖头来 ——谈VC++对象模型 (美)简  格雷 程化    译 译者前言 一个C++程序员,想要进一步提升技术水平的话,应该多了解一些语言的语意细节。对于使用VC++的程序员来说,还应该了解一些VC++对于C++的诠释。Inside the C++ Object Model虽然是一本好书,然而,书的篇幅多一些,又和具体的VC++关系小一些。因此,从篇幅和内容

maowenge的专栏 2270

[转载]C++继承与内存分配,虚基类指针vbptr和虚函数指针vfptr

转载:继承 内存分布 原作者:DylanWind class Base { public: int m_base; }; class DerivedA: public Base { public: int m_derivedA; }; class DerivedB: public Base { public: int m_deriv...

JMcc_的博客 887

C++ 对象的内存布局(上)

转自陈皓的博客前言在谈论虚函数表里,至少有以下这些内容没有涉及: - 有成员变量的情况。 - 有重复继承的情况。 - 有虚拟继承的情况。 - 有钻石型虚拟继承的情况。所以,这篇文章将会是《C++虚函数表解析》的一个续篇,也是一篇高级进阶的文章。对象的影响因素简而言之,我们一个类可能会有如下的影响因素: 成员变量 虚函数(产生虚函数表) 单一继承(只继承于一个类) 多重继承(继承多个类) 重复

yapian8的专栏 725

c++继承中的内存布局 .

今天在网上看到了一篇写得非常好的文章,是有关c++类继承内存布局的。看了之后获益良多,现在转在我自己的博客里面,作为以后复习之用。 ——谈VC++对象模型 (美)简.格雷 程化    译 译者前言 一个C++程序员,想要进一步提升技术水平的话,应该多了解一些语言的语意细节。对于使用VC++的程序员来说,还应该了解一些VC++对于C++的诠释。 Inside the C++ Objec

求索 696

Windows软件开发实践:C++虚函数与虚函数表

摘要:本文深入探讨了C++虚函数表(vtbl)的实现机制及其在继承中的特性。虚函数表是存储虚函数地址的指针数组,位于类对象内存起始处,所有对象共享同一虚表。文章通过代码实例验证了虚表的存在和访问方式,并分析了5种继承场景下的虚表布局:(1)基类、(2)单继承无覆盖、(3)单继承有覆盖、(4)多重继承无覆盖、(5)多重继承有覆盖。实验表明,派生类会继承基类虚表,重写虚函数会替换对应表项,多重继承会产生多个虚表。研究揭示了C++多态性的底层实现原理。

fairyfar的专栏 584
上一篇: 【 C/C++】变量在内存里的存储区域
下一篇: 【VC++】虚函数 内存结构 - 第五篇(多重继承,有虚函数覆盖)
maoyeahcom
博客等级 码龄15年 14粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值