[翻译] Effective C++, 3rd Edition, Item 15: 在 resource-managing classes(资源管理类)中提供对 raw resources(裸资源)的访问

<<Effective C++>>读书笔记3: 资源管理 每一个Item都很经典,都需要去思考揣摩,我在这里将要点抽象出来,便于日后快速回忆;我只是在做文章的“搬运工”。         Item 13 使用对象管理资源 1. 当一个 auto_ptr 被销毁时,会自动删除它所指向的东西,所以不要让超过一个的 auto_ptr 指向同一个对象。如果发生了这种事情,那个对象就会被删除超过一次,而且会让你的程序进入未定义行为。为了防止这个问题,aut 阅读详情

Item 15: 在 resource-managing classes(资源管理类)中提供对 raw resources(裸资源)的访问

作者:Scott Meyers

译者:fatalerror99 (iTePub's Nirvana)

发布:http://blog.youkuaiyun.com/fatalerror99/

resource-managing classes(资源管理类)真是太棒了。他们是你防御 resource leaks(资源泄漏)的堡垒,没有这样的泄漏是设计良好的系统的基本特征。在一个完美的世界中,你可以在所有你与资源的交互中依赖这样的 classes,从来不需要因为对 raw resources(裸资源)的直接访问而玷污你的手。但是这个世界并不完美,很多 APIs 直接涉及资源,所以除非你打算坚决放弃使用这样的 APIs(很少成为现实的事),否则,你只得经常绕过 resource-managing object(资源管理对象)而直接处理 raw resources(裸资源)。

例如,Item 13 介绍的使用类似 auto_ptr 或 tr1::shared_ptr 这样的 smart pointers(智能指针)来持有对类似 createInvestment 这样的 factory function(工厂函数)的调用的结果想法:

std::tr1::shared_ptr<Investment> pInv(createInvestment());  // from Item 13

假设你打算使用的一个函数与 Investment objects 一起工作时是这样的:

int daysHeld(const Investment *pi);        // return number of days
                                           // investment has been held

你打算像这样调用它,

int days = daysHeld(pInv);                 // error!

但是这代码不能编译:daysHeld 要求一个裸的 Investment* 指针,但是你传给它一个类型 tr1::shared_ptr<Investment> 的 object。

你需要一个将 RAII class(当前情况下是 tr1::shared_ptr)的 object 转化为它所包含的 raw resource(裸资源)(例如,底层的 Investment*)的方法。有两个常规方法可以做到:explicit conversion(显式转换)和 implicit conversion(隐式转换)。

tr1::shared_ptr 和 auto_ptr 都提供一个 get member function(成员函数)用于实行一次 explicit conversion(显示转换),也就是,用于返回 smart pointer object(智能指针对象)内部的raw pointer(裸指针)(的一个拷贝):

int days = daysHeld(pInv.get());           // fine, passes the raw pointer
                                           // in pInv to daysHeld

就像实际上的所有 smart pointer classes(智能指针类)一样,tr1::shared_ptr 和 auto_ptr 也都重载了 pointer dereferencing operators(指针解引用操作符)(operator-> 和 operator*),而这样就允许到底层 raw pointers(裸指针)的 implicit conversion(隐式转换):

class Investment {                                 // root class for a hierarchy
public:                                            // of investment types
  bool isTaxFree() const;
  ...
};

Investment* createInvestment();                    // factory function

std::tr1::shared_ptr<Investment>                   // have tr1::shared_ptr
  pi1(createInvestment());                         // manage a resource

bool taxable1 = !(pi1->isTaxFree());               // access resource
                                                   // via operator->
...
std::auto_ptr<Investment> pi2(createInvestment()); // have auto_ptr
                                                   // manage a
                                                   // resource

bool taxable2 = !((*pi2).isTaxFree());             // access resource
                                                   // via operator*

...

因为有些时候有必要取得 RAII object 内部的 raw resource(裸资源),所以一些 RAII class 的设计者就通过提供一个 implicit conversion function(隐式转换函数)来给刹车抹油。例如,考虑以下这个 RAII class,它要为一个 C API 提供原始状态的 fonts(字体):

FontHandle getFont();                      // from C API—params omitted
                                           // for simplicity

void releaseFont(FontHandle fh);           // from the same C API
class Font {                               // RAII class
public:
  explicit Font(FontHandle fh)             // acquire resource;
  : f(fh)                                  // use pass-by-value, because the
  {}                                       // C API does

  ~Font() { releaseFont(f); }              // release resource

private:
  FontHandle f;                            // the raw font resource
};

假设有一个巨大的 font-related(字体相关)的 C API 只能与 FontHandle 打交道,这就频繁地需要将 Font objects 转换为 FontHandles。Font class 可能提供一个像 get 这样的 explicit conversion function(显示转换函数):

class Font {
public:
  ...
  FontHandle get() const { return f; }     // explicit conversion function
  ...
};

不幸的是,这就要求客户每次想要与这个 API 打交道时都要调用 get:

void changeFontSize(FontHandle f, int newSize);     // from the C API

Font f(getFont());
int newFontSize;
...

changeFontSize(f.get(), newFontSize);               // explicitly convert
                                                    // Font to FontHandle

一些程序员可能发现对这个转换的显式请求的需要令人郁闷到足以避免使用这个 class。反过来,这又增加了 leaking fonts(字体泄漏)的机会,而这每一件事都是通过设计 Font class 来避免的

可选择的办法是为 Font 提供一个到它的 FontHandle 的 implicit conversion function(隐式转换函数):

class Font {
public:
  ...
  operator FontHandle() const { return f; }        // implicit conversion function
  ...
};

这样就可以使对 C API 的调用简单而自然:

Font f(getFont());
int newFontSize;
...

changeFontSize(f, newFontSize);            // implicitly convert Font
                                           // to FontHandle

不利的方面是 implicit conversions(隐式转换)增加了错误的机会。例如,一个客户可能会在想要使用 Font 的地方意外地创建一个 FontHandle:

Font f1(getFont());

...

FontHandle f2 = f1;                        // oops! meant to copy a Font
                                           // object, but instead implicitly
                                           // converted f1 into its underlying
                                           // FontHandle, then copied that

现在,程序有了一个被 Font object f1 管理的 FontHandle,但是这个 FontHandle 也能通过直接使用 f2 来加以利用。这几乎绝对不会是什么好事。例如,当 f1 被销毁,字体将被释放,f2 则被 dangle(悬挂)。

关于是否提供从一个 RAII class 到它的底层资源的 explicit conversion(显式转换)(例如,通过一个 get member function(成员函数))或者是否允许 implicit conversion(隐式转换)的决定,要依靠 RAII class 被设计履行的具体任务和它被计划使用的情境而做出。最好的设计很可能就是坚持 Item 18 的建议(使 interfaces(接口)易于正确使用,而难以错误使用)的那一个。通常,一个类似 get 的 explicit conversion function(显式转换函数)是更可取的方式,因为它将意外的 type conversions(类型转换)的机会减到最少。然而有时,通过 implicit type conversions(隐式类型转换)提高使用的自然性将使天平向那个方向倾斜。

你可能已经意识到,函数返回一个 RAII class 内部的 raw resource(裸资源)违背了 encapsulation(封装性)。这是正确的,但这并非像它开始看上去那样是个设计的祸患。RAII classes 的存在并非为了封装什么东西;它的存在是为了确保一个特定的动作—— resource release(资源释放)——的发生。如果你希望,资源的 encapsulation(封装性)的地位也可以提高到这个主要功能之上,但这并非必需。此外,一些 RAII classes 将实现的严格封装性和底层资源的非常宽松的封装性结合在一起。例如,tr1::shared_ptr 整体封装了它的 reference-counting machinery(引用计数机制),但它依然提供对它所包含的 raw pointer(裸指针)的简单访问。就像大多数设计良好的 classes,它隐藏了客户不需要看到的,但它也让客户的确需要访问的那些东西可以利用。

Things to Remember

  • APIs 经常需要访问 raw resources(裸资源),所以每一个 RAII class 都应该提供一种方法以取得它所管理的资源。
  • 访问可以经由 explicit conversion(显式转换)或者 implicit conversion(隐式转换)进行。通常,explicit conversion(显式转换)更安全,而 implicit conversion(隐式转换)对客户来说更方便。
tq2440资料裸奔三部曲 裸奔三部曲tq2440开发板的无os开发资料,菜鸟的初学arm嵌入式开发资料 立即下载

相关推荐

H264裸流视频

该文件为本人亲自录制,格式为 H264裸流,帧率为15帧。方便大家测试调试,希望能最大化的帮助大家,有对于视频解码不懂的朋友,欢迎留言。

Effective C++之 Item 15: 在资源管理类中准备访问裸资源(raw resources)

资源管理类真是太棒了。他们是你防御资源泄漏的防波堤,没有这样的泄漏是设计良好的系统的基本特征。在一个完美的世界中,你可以在所有与资源的交互中依赖这样的类,从来不需要因为直接访问裸资源(raw resources)而玷污你的手。但是这个世界并不完美,很多 API 直接涉及资源,所以除非你计划坚决放弃使用这样的 API(这种事很少会成为实际),否则,你就要经常绕过资源管理类而直接处理裸资源(raw ...

janeqi1987的专栏 395

Python 静态导入与动态导入

python中模块的静态导入 与 动态导入(运行时指定模块),以及具体对应示例。

慢也好,步子小也好,往前走就好~ 717

[转贴]Git 魔法

 Git 魔法 Ben Lynn中文版PDF 版本下载:Git_Magic_CN.pdf 译自:http://www-cs-students.stanford.edu/~blynn/gitmagic$c856fe230d218688b314697794db185fbca1efe6$Git 魔法By Ben Lynn前言1. 致谢!

走南闯北的专栏 4721

YOLOv8 ultralytics使用笔记----labelme标记数据,训练模型、追踪目标。

Ultralytics是一个Python库,它是为执行高级计算机视觉任务而创建的,如对象检测、实例分割、图像分类等。Ultralytics为YOLO模型发布了一个全新的存储库,它被构建为用于机器视觉统一框架。这里先利用,并激活。

qq_48050838的博客 1万+

手把手教你排查libstdc++.so.6版本问题:从GLIBCXX缺失到完美解决

本文深入解析Linux系统中常见的GLIBCXX版本缺失问题,以`ImportError: /lib/x86_64-linux-gnu/libstdc++.so.6: version 'GLIBCXX_3.4.29' not found`为例,从动态链接原理入手,提供使用`strings`和`find`命令的诊断方法,并详细对比了四种解决方案的优缺点。文章重点推荐通过设置`LD_LIBRARY_PATH`或更新系统库的安全策略,并最终建议使用Docker容器化技术实现环境依赖的根治与统一管理。

j7k8l的博客 301

nginx 伪静态、裸域名跳转、禁止某个文件或目录被访问、禁止爬虫拔取资源配置...

裸域名跳转配置:      在server配置中添加:   if ($host != 'www.3gi.cn'){ rewrite ^/(.*)$ http://www.3gi.cn/$1 permanent; }  所有访问该server的主机名不等于指定的www.3gi.cn(当然包括直接3gi.cn),都会跳转到www.3gi.cn去。   ...

wujie39的博客 2260

如何在INCA中修改标定量的初始值,并刷回控制器

测试过程中,有些时候,标定量来不及修改,这就需要修改标定量的初始值了,又不想打开模型重新编译,因此直接在INCA中修改,然后再刷回控制器,就成了最佳选择,之前也学过,长时间不用,忘记怎么搞了,最近又用到了,这次记录一下,以后用到的时候,就不用在网上东翻西找了。截止到2023年11月24日,共找到了两种方法可以实现修改。

weixin_43406519的博客 4204

Android中资源文件夹res/raw和assets的使用

<br />*res/raw和assets的相同点:<br />1.两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。<br /><br />*res/raw和assets的不同点:<br />1.res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.filename;assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类。<br />2.res/raw不可以有目录结构,而assets则可以有目录结构,也就是

zuolongsnail的专栏 6万+

基于拟蒙特卡洛模拟法的随机潮流计算matlab程序

由式(4-11)可知,蒙特卡洛模拟法的计算量不受电力系统规模大小影响,因此该方法在一些复杂的电力系统中可以得到应用,包括处理电力系统中有多个间歇性新能源接入的问题,解决系统中多个节点之间相关性问题等等。本章在此基础上提出了基于拟蒙特卡洛模拟的随机潮流计算方法,并且对拟蒙特卡洛法中的拟随机数序列进行了改进,大大提高了随机潮流的计算效率。模拟法的具体思路如下:基于实际工程问题的求解需要,建立与之相对应的随机模拟过程和随机概率模型,使得它们的参数,包括概率分布或者数学期望,能够等于问题的实际解;

weixin_47365903的博客 1797

WinIDEA基于IC5000烧录代码和调试教程

winIDEA就是ic5000用来烧录代码和调试代码的上位机,本文旨在介绍其如何去烧录代码并且调试

m0_56208280的博客 4163

深挖C++:类和对象(中)

(先进后出)

xys_678的博客 254

DMDiff(2025):一种基于SAR光学数据融合的双分支多模态条件引导扩散模型-k学长深度学习专栏

DMDiff提出了一种基于扩散模型的多模态遥感图像去云方法,通过双分支网络分别提取SAR的结构信息和光学图像的光谱特征,再利用跨模态注意力机制实现特征融合。创新性地采用IAP策略直接预测无云图像而非噪声,有效解决了传统方法在遥感图像处理中易出现的光谱失真问题。实验表明该方法在PSNR等指标上显著优于现有技术,但存在计算量大、生成速度慢等不足。未来可结合加速采样策略和几何约束进一步优化。

424

C++移动构造函数详解

移动构造函数是C++11引入的一种特殊构造函数,用于从临时对象(右值)"窃取"资源来初始化新对象,而不是进行昂贵的深拷贝。char* data;public:// 移动构造函数:参数是右值引用 &&// 关键:把源对象的资源置空。

拒绝AI文,努力在AI时代写出感动人心的好文章 394

NVIDIA Omniverse 技术浅析(三):NVIDIA RTX 技术

NVIDIA RTX 技术是 NVIDIA 推出的革命性图形渲染技术,旨在通过硬件加速和软件优化,实现高质量的实时图形渲染。RTX 技术在 NVIDIA Omniverse 平台中扮演着至关重要的角色,为其提供了强大的渲染能力。

m0_75253143的博客 351

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

ThunderKittens 深度解析:一个不基于 MLIR 的 C++ 模板 GPU DSL

Triton 是"让更多人能写 GPU kernel",ThunderKittens 是"让会写的人写得更爽"。前者用 MLIR 换易用性,后者用 C++ 模板换可控性。它们不是替代关系,而是覆盖了 GPU 编程光谱的两端。ThunderKittens 的出现,本质上是对"GPU DSL 必须基于 MLIR"这一默认假设的挑战。编译期类型系统本身就可以是一个强大的 DSL 基础设施,不需要中间 IR,不需要黑盒 pass,也能实现 tile 级抽象和零运行时开销。

Maxwell_Newton的博客 349

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

跟我学c++中级篇—类型定义的方式

本文系统阐述了编程中类型定义的重要性及c++中的实现方式。重点对比了宏定义、typedef与modern using三种机制,指出using在可读性、灵活性和模板支持上的优势,推荐优先使用。同时提醒开发者注意别名滥用、类型歧义、错误信息冗长等问题,强调统一规范与合理设计。最终结论:在现代c++开发中,应以using为主,兼顾简洁性与可维护性,避免陷入命名混乱与编译困境。

fpcc的专栏 88

深度学习工具包 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&#39;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(&#39;DeepLearnToolbox&#39;));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(&#39;state&#39;,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&#39;); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand(&#39;state&#39;,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 = &#39;sigm&#39;;%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, &#39;Too big error&#39;);```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(&#39;state&#39;,0)sae = saesetup([784 100]);sae.ae{1}.activation_function = &#39;sigm&#39;;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)&#39;)% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;;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, &#39;Too big error&#39;);```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x&#39;,28,28,60000))/255;test_x = double(reshape(test_x&#39;,28,28,10000))/255;train_y = double(train_y&#39;);test_y = double(test_y&#39;);%% 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&#39;ll get around 1.2% errorrand(&#39;state&#39;,0)cnn.layers = { struct(&#39;type&#39;, &#39;i&#39;) %input layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 6, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %sub sampling layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 12, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 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, &#39;Too big error&#39;);```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(&#39;state&#39;,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, &#39;Too big error&#39;);%% ex2 neural net with L2 weight decayrand(&#39;state&#39;,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, &#39;Too big error&#39;);%% ex3 neural net with dropoutrand(&#39;state&#39;,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, &#39;Too big error&#39;);%% ex4 neural net with sigmoid activation functionrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;; % 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, &#39;Too big error&#39;);%% ex5 plotting functionalityrand(&#39;state&#39;,0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = &#39;softmax&#39;; % 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, &#39;Too big error&#39;);%% 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(&#39;state&#39;,0)nn = nnsetup([784 20 10]); nn.output = &#39;softmax&#39;; % 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, &#39;Too big error&#39;);```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

【C++——类和对象(上)】筑基篇:以封装奠定面向对象之基

本文系统梳理C++类与对象的核心知识点,涵盖类的定义、访问限定符(public/private)、类作用域、对象实例化及内存布局。重点解析封装思想、this指针机制、空类大小为1字节的原因,以及类与对象在内存中的存储差异。通过对比C语言结构体与C++类,揭示面向对象设计的优势:数据保护、接口统一、命名隔离与代码可维护性提升。内容由浅入深,适合作为学习笔记与复习参考。

2602_95684935的博客 497

C++ 函数模版

模板参数:● template ,T 就是类型占位符,名字可以自定义,习惯用T● 占位符可以在函数返回值、形参、函数内部当作类型使用使用要点模板代码一般写在头文件:编译器需要看到完整模板源码,才能在每个编译单元完成实例化全局函数、类内成员函数都可以写成模板实例化发生在编译阶段,不是运行时隐式实例化:调用时编译器自动推导实参类型,生成对应版本函数。

2501_94041724的博客 307

C++ 运行时多态与虚函数机制全面剖析【面试重点】

构成C++ 运行时多态必须是基类的指针或者引用调用虚函数。被调用的函数必须是虚函数,并且派生类必须对该虚函数完成重写/覆盖(Override)。只有基类的指针或引用才能既指向基类对象,又指向派生类对象(切片机制);而只有完成了虚函数重写,派生类与基类才具备不同的函数行为,达到“指向谁就调用谁”的效果。在类成员函数的前面加上virtual关键字修饰,该成员函数就成为了虚函数。public:// 成员函数前加 virtual 修饰,声明为虚函数。

Fuyo_0209的博客 450

#SQLite 数据库笔记一:(概念 / 终端指令 / SQL 语句 / C 编程 / 回调函数)

数据库 = 数据的仓库,假设数据是海量。能力说明存储数据持久化保存,程序退出数据还在统计数据、分组、排序数据管理增、删、改、查(CRUD)嵌入式设备上也会用数据库(单片机网关、路由器、工业 HMI 都常见),因为 sqlite 体积小、无需服务进程、单文件即可。数据库 = 库 > 表 > 记录(行) > 字段(列)sqlite3 = 开源、C 写的、单文件、免安装、最多 2T 的嵌入式关系型数据库。

lwq20051110的博客 251

1-10 PostgreSQL中多表连接全解:inner/left/right/full/cross join

本文基于 PostgreSQL 15+ 完整拆解 5 种主流连接:内连接、左连接、右连接、全连接、笛卡尔连接。结合可落地的测试数据,演示每种连接的执行逻辑、返回结果,重点剖析 NULL 值对 JOIN 匹配的核心影响,彻底解决多表连接数据丢失、匹配异常、结果错乱的问题。

zhangjw34的专栏 105

【C++ 基础入门】C++继承(下):问题、底层原理与组合

C++继承(菱形继承的问题、虚继承原理、继承与组合、构造顺序)

2601_96587588的博客 802

蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级 备考:莫队算法离线区间查询详解

备赛进行时:第十八届蓝桥杯软件赛报名已于 2026-10-08 10:00 开启、12-18 14:00 截止,省赛定在 2027-04-10(C/C++·Python 程序设计 9:00–13:00);中国电子学会 2026 年 12 月软件编程(C/C++ 一级至十级、Python 一级至六级)考级报名 9/23–12/2 16:00、统考 12-12;全国青少年信息素养大赛 2026—2027 赛季算法应用主题赛也已进入复盘练兵窗口。

IT_Scratch的博客 170

c++ explicit关键字详解

explicit。

拒绝AI文,努力在AI时代写出感动人心的好文章 151

825 mW 顶上 212 °C:ASM491S 的 105 °C/W、250 mA 短路电流与热关断

25 °C 环境里结温 34.1 °C,125 °C 环境里结温 134.1 °C——后者已经离 150 °C 只有 16 °C 了,但还在范围内。换个角度看同一件事:从 25 °C 和从 125 °C 起算,温升都是 86.6 °C,但一个到 111.6 °C(还在范围内),一个到 211.6 °C(远远超限)。这个算例里 20 °C/W 是我假设的,实际值取决于机壳材料、密封程度、有没有风扇,跨度可以从 5 °C/W 到 50 °C/W 以上。外面 50 °C 的机箱,盒内就是 63.9 °C。

ANSILIC的博客 393
上一篇: [翻译] Effective C++, 3rd Edition, Item 14: 谨慎考虑 resource-managing classes(资源管理类)中的拷贝行为
下一篇: [翻译] Effective C++, 3rd Edition, Item 16: 成对使用的 new 和 delete 要使用相同的形式
fatalerror99
博客等级 码龄24年 166粉丝 20原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值