Effective C++ 2e Item25

LLaMA政务落地实战:安全加固、RAG构建与等保三级部署指南 大语言模型(LLM)在政务场景的落地,核心不在参数规模,而在安全可控、可解释、可审计的技术实现路径。LLaMA凭借Apache 2.0开源协议、完整本地权重、PyTorch原生架构及灵活量化能力,成为当前政务AI适配度最高的基础模型之一;其技术价值体现在对数据主权保障、决策溯源支持、国产芯片兼容与轻量边缘部署的系统性满足。典型应用场景包括政策智能问答、公文辅助生成、基层执法笔录、重大项目合规研判等,均需嵌入RAG知识库、指令微调、输出过滤与全链路审计机制。本文聚焦LLaMA在等保三级环境下的真实部署——从G 阅读详情

条款25: 避免对指针和数字类型重载

快速抢答:什么是“零”?

更明确地说,下面的代码会发生什么?

void f(int x);
void f(string *ps);

f(0);                        // 调用f(int)还是f(string*)?

答案是,0是一个int——准确地说,一个字面上的整数常量——所以,“总是”f(int)被调用。这就是问题所在:因为不是所有的人总是希望它这样执行。这是C++世界中特有的一种情况:当人们认为某个调用应该具有多义性时,编译器却不这么干。

如果能想办法用符号名(比如,NULL表示null指针)来解决这类问题就好了,但实现起来比想象的要难得多。

最先想到的应该是声明一个称为NULL的常量,但常量要有类型,NULL的类型应该是什么呢?它要兼容于所有的指针类型,但满足条件的唯一一个类型是void*,而且,要想把void*指针传给某类型的指针,必须要有一个显式的类型转换。这样做不仅很难看,而且乍看不比最初的情况好到哪儿去:

void * const NULL = 0;             // 可能的NULL定义

f(0);                              // 还是调用f(int)
f(static_cast<string*>(NULL));     // 调用f(string*)
f(static_cast<string*>(0));        // 调用f(string*)

不过细想一下,用NULL来表示一个void*常量的方法还是比最初要好一点,因为如果能保证只是用NULL来表示null指针的话,是可以避免歧义的:

f(0);                              // 调用f(int)
f(NULL);                           // 错误! — 类型不匹配
f(static_cast<string*>(NULL));     // 正确, 调用f(string*)

至少现在已经把一个运行时的错误(对0调用了“错误的”f函数)转移成了一个编译时的错误(传递一个void*给string*参数)。情况稍微有点改善(见条款46),但需要进行类型转换还是令人讨厌。

如果想可耻地退回去求助于欲处理,你会发现它也解决不了问题,因为最明显的办法不外乎:

#define NULL 0

或

#define NULL ((void*) 0)

第一种办法只不过是字面上的0,本质上还是一个整数常量(如果你记得的话,还是最初的问题);第二种方法则又把你拉回到“传void*指针给某种类型的指针”的麻烦中。

如果对类型转换的规则有研究,你就会知道,C++会认为“从long int 0到null指针的转换”和“从long int到int的转换”一样,没什么不妥的。所以可以利用这一点,将多义性引入到上面那个你可能认为有“int/指针”问题的地方:

#define NULL 0L            // NULL现在是一个long int

void f(int x);
void f(string *p);

f(NULL);                   // 错误!——歧义

然而,当想重载long int和指针时,它又不起作用了:

#define NULL 0L

void f(long int x);        // 这个f现在的参数为long
void f(string *p);

f(NULL);                   // 正确, 调用f(long int)

实际编程中,这比把NULL定义为int可能要安全,但它无非只是在转移问题,而不是消除问题。

这个问题可以消除,但需要使用C++语言最新增加的一个特性:成员函数模板(往往简称为成员模板)。顾名思义,成员函数模板是在类的内部为类生成成员函数的模板。拿上面关于NULL的讨论来说,我们需要一个“对每一个T类型,运作起来都象static_cast<T*>(0)表达式”的对象。即,使NULL成为一个“包含一个隐式类型转换运算符”的类的对象,这个类型转换运算符可以适用于每种可能的指针类型。这就需要很多转换运算符,但它们可以求助于C++从成员模板生成:

// 一个可以产生NULL指针对象的类的第一步设计
class NullClass {
public:
  template<class T>                       // 为所有类型的T
    operator T*() const { return 0; }     // 产生operator T*;
};                                        // 每个函数返回一个
                                          // null指针
                                          //

const NullClass NULL;             // NULL是类型NullClass
                                  // 的一个对象

void f(int x);                    // 和以前一样

void f(string *p);                // 同上

f(NULL);                          // 将NULL转换为string*,
                                  // 然后调用f(string*)

这是一个很好的初步设计,但还可以从几方面进行改进。第一,我们实际上只需要一个NullClass对象,所以给这个类一个名字没必要;我们只需要定义一个匿名类并使NULL成为这种类型。第二,既然我们是想让NULL可以转换为任何类型的指针,那就也要能够处理成员指针。这就需要定义第二个成员模板,它的作用是为所有的类C和所有的类型T,将0转换为类型T C::*(指向类 C里类型为T的成员)。(如果你不懂成员指针,或者你从没听说过,或很少用,那也不要紧。成员指针可以称得上是稀有动物,是很少见,也许很多人从来没用过它。对此好奇的人可以参考条款30,那儿对成员指针进行了较详细的讨论。)最后,要防止用户取NULL的地址,因为我们希望NULL的行为并不是象指针那样,而是要象指针的值,而指针的值(如0x453AB002)是没有地址的。

所以,改进后的NULL的定义看起来就象这样:

const                             // 这是一个const对象...
class {
public:
  template<class T>               // 可以转换任何类型
    operator T*() const           // 的null非成员指针
    { return 0; }                 //

  template<class C, class T>      // 可以转换任何类型
    operator T C::*() const       // 的null成员指针
    { return 0; }

private:
  void operator&() const;         // 不能取其地址
                                  // (见条款27)

} NULL;                           // 名字为NULL

这就是所看到的真实的代码,虽然在实际编程中有可能想给类一个名字。如果不给名字,编译器里指向NULL类型的信息也确实很难理解。

成员模板的用法的另一个例子参见条款M28。

重要的一点是,以上所有那些产生正确工作的NULL的设计方案,只有在你自己是调用者的时候才有意义。如果你是设计被调用函数的人,写这样一个给别人使用的NULL其实没有多大的用处,因为你不能强迫你的调用者去使用它。例如,即使为你的用户提供了上面开发的那个NULL,你还是不能防止他们这样做:

f(0);                  // 还是调用f(int),
                       // 因为0还是int

它还是和本条款最前面的出现的问题一样。

所以,作为重载函数的设计者,归根结底最基本的一条是,只要有可能,就要避免对一个数字和一个指针类型重载。

angular中访问本地json文件 先在assets文件夹下写一个json文件,这样在打完包之后也可以手动修改json文件内容 1、在需要访问本地json文件的ts文件里面引入 import{HttpClient}from'@angular/common/http'; 2、用ajax请求调用,我这里是用已经封装好的ajax请求调用 gethttp = ()=>{ var self = this self.ajax.getAjax("../../assets/server.json","g... 阅读详情

相关推荐

MobaXterm结合SSH密钥对安全连接阿里云ECS的实战教程

本文详细介绍了如何使用MobaXterm结合SSH密钥对安全连接阿里云ECS的实战教程。通过对比传统密码登录的风险,重点讲解了密钥对的生成与配置、阿里云控制台的密钥绑定技巧,以及MobaXterm的高级设置和故障排查方法,帮助用户实现高效、安全的远程连接。

weixin_29208327的博客 467

effective c++ item 25-29

effective c++

weixin_44609676的博客 449

Pixhawk RPi CM4 Baseboard 树莓派CM4安装Ubuntu20.04 server 配置ros mavros mavsdk

cm4配置ros mavros连接pixhawk4 Pixhawk RPi CM4 Baseboard

baidu_41704597的博客 2128

[翻译] Effective C++, 3rd Edition, 附录 B. 第二和第三版之间的 Item 映射

附录 B. 第二和第三版之间的 Item 映射作者:Scott Meyers译者:fatalerror99 (iTePubs Nirvana)发布:http://blog.youkuaiyun.com/fatalerror99/Effective C++ 的第三版在很多方面与第二版不同,其中最引人注目的是它包含很多新的信息。然而,第二版的大部分内容依然保留在第三版中,虽然经常会改变形式和位置

艺术编程 5819

从SVF文件到高效验证:Formality中set_svf命令的隐藏技巧与实战解析

本文深入解析Formality中set_svf命令的高级应用技巧,涵盖SVF文件生成策略、多文件加载优化及验证效率提升方法。通过-append和-ordered选项的实战应用,帮助工程师解决芯片验证中的常见问题,实现验证通过率与运行效率的双重提升。

mqtt6iot的博客 820

从ARCore到AICore:揭秘Google如何通过系统级服务推动Android生态创新

本文深入探讨了Google如何通过AICore等系统级服务推动Android生态创新。从ARCore到AICore,Google通过分层解耦策略将AI能力下沉至系统层,实现端侧大模型推理,如Gemini Nano在Pixel 8 Pro中的应用。文章剖析了AICore的技术架构、开发者赋能路径及场景化实践,展示了其在通信、内容创作和生产力工具中的卓越表现。

rust6ferris的博客 545

Effective c++ Item 28 不要返回指向对象内部数据(internals)的句柄(handles)

假设你正在操作一个Rectangle类。每个矩形可以通过左上角的点和右下角的点来表示。为了保证一个Rectangle对象尽可能小,你可能决定不把定义矩形范围的点存储在Rectangle类中,而是把它放入一个辅助结构体中,Rectangle中声明一个指向它的指针就可以了: 1 class Point { // class for repre

小小小程序员的博客 218

FFmpeg入门详解之110:RTSP协议讲解

TCP/IP 协议体系中的一个应用层协议,该协议定义了一对多应用程序如何有效地通过 IP 网络传送多媒体数据。RTSP在体系结构上位于RTP和RTCP之上,它使用TCP或UDP完成数据传输。HTTP与RTSP相比,HTTP传送HTML,而RTSP传送的是多媒体数据。正在上传…重新上传取消RTSP是基于文本的协议,采用ISO10646字符集,使用UTF-8编码方案。行以CRLF中断(\r\n:10,13:0x0A,0x0D),包括消息类型、消息头、消息体和消息长。

福优学苑@音视频+流媒体 2529

读书笔记 effective c++ Item 43 了解如何访问模板化基类中的名字

1. 问题的引入——派生类不会发现模板基类中的名字 假设我们需要写一个应用,使用它可以为不同的公司发送消息。消息可以以加密或者明文(未加密)的方式被发送。如果在编译阶段我们有足够的信息来确定哪个信息会被发送到哪个公司,我们可以使用基于模板的解决方案:   1 class CompanyA { 2 public: 3 ... 4 void sendCleartext(const st...

HarlanC的专栏 125

(数字图像处理MATLAB+Python)第五章图像增强-第一节:图像增强概述和基于灰度级变换的图像增强

图像增强(Image Enhancement):指不考虑图像降质原因,利用各种数学方法和变换手段,增强图像中人们感兴趣部分或提高有用的图像特征的清晰度。从图像质量来看,图像增强提高了图像的可懂度,改善了图像的视觉效果例如在现实场景中,针对那些对比度较差、视觉效果不好的图像,我们就可以利用图像增强改善视觉质量图像增强可分为如下几种基于灰度级变换的图像增强基于直方图修正的图像增强基于照度反射模型的图像增强基于模糊技术的图像增强基于伪彩色处理的图像增强其他图像增强方法分段线性灰度级变换。

快乐江湖的博客 3334

PPT里文字太多如何排版-一口气教你7种布局瞬间让PPT高大上起来

PPT里全是文字且很拥挤怎么办?本篇教你使用7种不同的排版让你的PPT瞬间变得高大上起来。

打造全国最全的AI Agent开发知识领域的博客 5025

读书笔记 effective c++ Item 10 让赋值运算符返回指向*this的引用

一个关于赋值的有趣的事情是你可以将它们链在一起: 1 int x, y, z; 2 3 x = y = z = 15; // chain of assignments 同样有趣的是赋值采用右结合律,所以上面的赋值链被解析成下面这个样子: 1 x = (y = (z = 15)); 在这里,15被赋值给z,然后赋值的结果(更新的z)被赋值给y,再然后赋值的结果(更新的Y)被赋值给x。 ...

HarlanC的专栏 152

java项目反编译工具记录,共计6个工具

java项目反编译工具记录,共计6个工具

橙-极纪元-JJYCheng 1802

读书笔记 effective c++ Item 28 不要返回指向对象内部数据(internals)的句柄(handles)...

假设你正在操作一个Rectangle类。每个矩形可以通过左上角的点和右下角的点来表示。为了保证一个Rectangle对象尽可能小,你可能决定不把定义矩形范围的点存储在Rectangle类中,而是把它放入一个辅助结构体中,Rectangle中声明一个指向它的指针就可以了: 1 class Point { // class for re...

weixin_34064653的博客 121

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C++ 知识补充

向量(vector)是一个封装了动态大小数组的顺序容器(SequenceContainer)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。C++中map提供的是一种键值对容器,里面的数据都是成对出现的,如下图:每一对中的第一个值称之为关键字(key),每个关键字只能在map中出现一次;第二个称之为该关键字的对应值。

weixin_47059239的博客 2131

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

[规范] c++Windows平台代码规范

微软风格=匈牙利风格=函数大驼峰+变量小驼峰+标明类型 例如InitTool(), mIsOpen, bOpen等谷歌偏c风格 下划线很多 谷歌风格linux使用比较多,例如init_tool(),m_is_open, is_open等好的编程风格有利于快速理解代码,好的编码习惯也是编码的基本。

二次元怪兽的博客 2842

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

C++AI编译错误自动修复神器-告别手动Debug的终极方案

在日常 C++ 开发中,编译错误是最频繁遇到的障碍之一。一个中等规模的项目在重构期间,一次 可能产生数十甚至上百条错误信息。这些错误往往具有级联效应——一个头文件的拼写错误可能导致下游十几个翻译单元同时报错,而真正需要修改的地方只有一处。传统的工作流是: 这个循环对于经验丰富的开发者来说尚可接受,但对于以下场景则效率极低:优势:局限:本项目最适合以下场景:阅读

weixin_48053866的博客 282

用Llama 3.2-Vision增强OCR实现文档结构化理解

光学字符识别(OCR)是文档数字化的基础技术,其核心原理在于图像预处理、文本定位与字符识别三阶段协同。传统OCR工具如Tesseract和PaddleOCR虽在文字提取层面成熟,但在语义结构理解(如标题识别、表格重建、签名判别)上存在天然局限。多模态大模型(如Llama 3.2-Vision)凭借视觉-语言对齐能力,可作为OCR后处理的‘认知大脑’,将坐标化文本块升维为带语义标签的结构化输出。该技术路径兼顾精度、可控性与数据安全,适用于工程图纸、财务票据、法律合同等复杂版式文档的本地化智能解析,已在医疗报告

cok8420的博客 334

五次多项式轨迹设计:面向工程师的视觉化运动规划方法

五次多项式是实现C²连续运动轨迹的核心数学工具,其六个自由度可精确约束起点/终点的位置、速度与加速度,从而满足机器人、动画、数控等系统对平滑性与物理可行性的双重要求。原理上,它通过解析求解线性边界方程组获得唯一曲线,避免数值振荡与过拟合;技术价值在于将抽象代数表达转化为可拖拽的几何控制点,显著降低工程直觉建模门槛;典型应用场景包括机械臂路径规划、镜头运镜设计、物理仿真初始化及高等数学教学可视化。本文聚焦‘Quintic’s’这一面向非程序员的交互式设计系统,深度融合曲率圆映射、实时合规校验与多维可视化反馈机

weixin_30715523的博客 435

GPT-4的1.8万亿参数与2%稀疏激活真相解析

大语言模型中的稀疏激活(Sparse Activation)是突破算力瓶颈的关键技术路径,其核心原理在于解耦模型的知识容量与实时计算负载。通过专家混合(MoE)架构,系统可在超大规模参数空间(如万亿级)中动态路由至少量活跃专家,实现按需计算,显著降低显存带宽压力与推理延迟。该技术不仅支撑了GPT-4等顶尖模型的高并发、低延迟服务,更在推荐系统、多任务学习和边缘AI部署中展现出工程普适性。本文聚焦MoE架构下的稀疏性本质、动态路由机制与真实激活比例验证方法,结合参数规模、负载均衡、硬件约束等维度,还原‘1.8

weixin_30387423的博客 412
上一篇: Effective C++ 2e Item24
下一篇: Effective C++ 2e Item26
lostmouse
博客等级 码龄26年 22粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值