C++深度解析 引用的本质分析 &(4)

Ollama、llama.cpp、LM Studio本质区别与选型指南 大模型本地部署工具常被泛化为‘跑模型的软件’,但其底层定位截然不同:Ollama是面向开发者的模型运行时环境,提供开箱即用的API与抽象化封装;llama.cpp是轻量级推理引擎,专注CPU/GPU极致性能与量化控制;LM Studio则是基于llama.cpp的桌面GUI外壳,主打零配置可视化交互。三者在模型格式支持(如GGUF vs safetensors)、硬件调度粒度(全层GPU加载 vs 自定义ngl)、API兼容性(OpenAI标准程度)上存在根本差异。理解这些原理,才能避免‘装上就崩’的踩坑现 阅读详情

C++深度解析 引用的本质分析(4)

 

 

 

引用

是另一个变量的别名(或者是一个已经存在存储空间的别名)。

引用在一些场合可以代替指针。

当引用作为函数的形参时,可以不初始化。

实例程序:

#include <stdio.h>

void swap(int& a, int& b)
{
    int t = a;
    a = b;
    b = t;
}

int main()
{
    int a = 1;
    int b = 2;
    
    swap(a, b);
    
    printf("a = %d, b = %d\n", a, b);   
    
    return 0;
}

结果如下:

 

 

 

特殊的引用:const 引用

声明:const Type& name = var;

用法:const Type& name <<-----等价于------>> Type* const name;(const int& name   ==  int* const name)

const引用让变量拥有只读属性。

当使用常量(字面常量)对const引用进行初始化时,C++编译器会为常量值分配空间,并将引用名作为这段空间的别名。

使用常量对const引用初始化后将生成一个只读变量。

实例程序:

(下列使得变量拥有只读属性)

#include <stdio.h>

void Example()
{
    printf("Example:\n");
    
    int a = 4;
    const int& b = a;   //b就是a变量的别名,操作b就等于操作a
    int *p = (int *)&b; //指针p指向a的地址
    
    //b = 5; //错误,引用b使得a变为只读变量

    *p = 5; //可以的
    
    printf("a = %d\n", a);
    printf("b = %d\n", b);
}

void Demo()
{
    printf("Demo:\n");
    
    //初始化引用为1,这样子就得到只读变量c,分配了4个字节的空间,初始化为1,c就是这4个字节空间的别名
    const int& c = 1;      //int temp = 1, const int& c = temp
    int *p = (int *)&c;   
    
    //c = 5; //c是只读
    
    *p = 5; //将4个字节的空间改为5
    
    printf("c = %d\n", c);
}

int main(int argc, char *argv[])
{
    Example();
    
    printf("\n");
    
    Demo();
    
    return 0;
}

结果如下:

 

 

 

引用有自己的存储空间

注意:

C++编译器在编译过程中,用指针常量作为引用的内部实现,因此引用所占用的空间大小与指针相同。

从使用的角度,引用只是一个别名,C++为了实用性而隐藏了引用的存储空间这一细节。

示例程序:

#include <stdio.h>

struct TRef
{
    char& r;
};

int main(int argc, char *agrv[])
{
    char c = 'c';
    char& rc = c;
    TRef ref = { c };
    
    printf("sizeof(char&) = %d\n", sizeof(char&)); //1
    printf("sizeof(rc) = %d\n", sizeof(rc)); //sizeof(c) => 1
    
    printf("sizeof(TRef) = %d\n", sizeof(TRef)); //4
    printf("sizeof(ref.r) = %d\n", sizeof(ref.r)); //sizeof(c) => 1
}

结果如下:

分析:

TRef结构体大小为4。引用的本质是指针常量,Type&  =  Type* const。所以上述示例中,char& r = char *const r(内部实现的),所以sizeof(TRef) = 4,指针占用4字节的空间。

 

 

 

引用的存储空间

在C++编译器内部,用指针来实现引用的。引用是要占用空间的。

示例程序一:

#include <stdio.h>

struct TRef
{
    char* before; //4个字节  起始地址:0xbfcbc71c
    char& ref;    //占用4个字节     0xbfcbc724 - 0xbfcbc71c = 8
    char* after; //4个字节  起始地址:0xbfcbc724
};

int main(int argc, char *argv[])
{
    char a = 'a';
    char& b = a;
    char c = 'c';
    
    TRef r = {&a, b, &c};
    
    printf("sizeof(r) = %d\n", sizeof(r));
    printf("sizeof(r.before) = %d\n", sizeof(r.before));
    printf("sizeof(r.after) = %d\n", sizeof(r.after));
    printf("&r.before = %p\n", &r.before);
    printf("&r.after = %p\n", &r.after);

}

结果如下:

通过上面的程序知道:引用的本质就是指针,C++希望利用引用在大多数情况下代替指针。

示例程序二:

  • 使用常量对const引用初始化时,编译器会自动分配一段空间,
  • 使用变量对const引用初始化时,编译器不会分配空间,而是将const引用和变量捆绑在一起
#include <stdio.h>
int main()
{
    int c = 0;
    
    const int& a = 1; //定义const引用a,指定a的初始化是个常量1
    const int& b = c; //定义const引用b,指定b的初始化是个变量c
    
    int *p = (int *)&a;
    
    
    //b = 2;          //错误,不能直接修改const引用的内容,因为b是个只读变量
    
    *p = 10;          //改变const引用a的内容
    printf("a = %d, b = %d, c = %d\n", a, b, c);
    
    p = (int *)&b;
    *p = 10;           //改变const引用b的内容
    printf("a = %d, b = %d, c = %d\n", a, b, c);
    
    return 0;
}

结果如下:

  • const引用a初始化的是一个常量1,但却能被修改成功,说明a有自己的一段存储空间
  • 而const引用b被指针修改后,变量c也跟着改变,说明const引用b和变量c的存储空间是一起的
  • 所以,在C++中,const修饰的是常量,而const &修饰的是只读变量(可以通过指针修改值)

 

 

 

函数返回引用

必须遵守,不要返回局部变量的引用。

示例程序:

#include <stdio.h>

int& demo() //其实返回 int *const(内部实现)
{
    int d = 0;
    
    printf("demo: d = %d\n", d);
    
    return d;//返回局部变量d的本身,返回的是引用 return &d;
}

int& func()
{
    static int s = 0;//存储在全局的存储区
    
    printf("func: s = %d\n", s);
    
    return s;//返回静态局部变量的引用 return &s
}

int main(int argc, char* argv[])
{
    int& rd = demo();
    int& rs = func();
    
    printf("\n");
    printf("main: rd = %d\n", rd);//这里的rd相当与野指针
    printf("main: rs = %d\n", rs);
    printf("\n");
    
    rd = 10;//很危险,demo的局部变量d已经不存在了
    rs = 11;//对rs的操作,相当于对s的操作
    
    demo();
    func();//静态局部变量s的别名rs,对rs的操作,相当于对s的操作
    
    printf("\n");
    printf("main: rd = %d\n", rd);//rd所代表的4字节空间已经不存在了,没意义
    printf("main: rs = %d\n", rs);
    printf("\n");
    
    return 0;
}

结果如下:

引用可以在最大程度上,避开内存操作的错误。引用的本质就是指针。

 

 

 

小结:

引用作为变量别名而存在旨在代替指针

const引用可以使得变量具有只读属性

引用在编译器内部使用指针常量实现

引用的最终本质为指针

引用可以尽可能的避开内存错误

 

 

DeepSeek V4 Flash本地部署:硬件调优与llama.cpp协议对齐指南 Flash Attention是一种面向高吞吐低延迟推理优化的注意力机制变体,其核心原理在于通过内存访问模式重构与算子融合降低显存带宽依赖;技术价值体现在单token生成延迟下降超30%,但对PCIe带宽、CUDA驱动ABI、cuBLASLt内核选择等底层设施高度敏感;典型应用场景包括Windows本地大模型推理、边缘端代码生成与VS Code嵌入式AI辅助;实际部署中必须同步解决`cuda error: no kernel image is available`和`flash download faile 阅读详情

相关推荐

VSCode C++开发环境深度配置:从IntelliSense到编译调试全解析

在C++开发中,集成开发环境(IDE)的智能感知(IntelliSense)和代码补全功能是提升开发效率的关键技术。其原理是通过解析项目的编译器路径、头文件包含路径和预定义宏,构建代码的语义模型,从而实现精准的语法高亮、错误检查和代码导航。这项技术的核心价值在于减少开发者的认知负担,避免因配置不当导致的头文件找不到、标准库不识别等问题。在实际应用场景中,尤其是在使用轻量级编辑器如VSCode进行跨平台C++项目开发时,正确的配置更显重要。本文聚焦于VSCode中C++语言特有的核心配置文件,如`c_cpp_

weixin_30522095的博客 370

深入分析C++引用 .

关于引用和指针的区别的文章很多很多,但是总是找不到他们的根本区别,偶然在codeproject上看到这篇文章,觉得讲的挺好的, 所以翻译了下,希望对大家有帮助。 原文地址: http://www.codeproject.com/KB/cpp/References_in_c__.aspx   引言       我选择写 C++ 中的引用是因为我感觉大多数人误解了引用。而我之所以有这个感受

669

4B模型+GGUF+llama.cpp:消费级硬件上的自动化编码实践

自动化编码并非单纯依赖大参数模型,而是由轻量级模型、高效格式与专用推理引擎共同构建的技术闭环。GGUF格式通过分块存储与原生量化支持,显著降低内存占用与加载延迟;llama.cpp则针对CPU/ARM设备优化内存映射与KV缓存管理,使4B级模型在树莓派、Windows台式机等消费级硬件上实现亚秒级首token响应和稳定吞吐。这种组合让开发者无需纠结CUDA驱动兼容性、显存碎片或环境配置,真正聚焦于需求描述本身。qwen2.5-4b作为典型代表,在代码生成质量、PEP8合规性、type hints完整性等方面

alince20008的博客 573

引用深层理解

1、使用引用作为参数来定义函数 #include &amp;amp;amp;lt;iostream&amp;amp;amp;gt; using namespace std; void Swap1(int, int); //传统交互 void Swap2(int*, int*); //指针定义 void Swap3(int&amp;amp;amp;amp;, int&amp;amp;amp;amp;); //引用定义 void show(const int&amp;amp;amp;amp;, co

ghyyys的博客 241

从零实现AES加密算法:C++语言逐字节深度解析

28%28%2%38%3%AES-128参数体系数据块大小密钥长度加密轮数扩展密钥长度每轮密钥长度 1.2 状态矩阵演化过程 #mermaid-svg-f0AsN11XbkV8tqvm {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-f0AsN11XbkV8tqvm .error-icon{fill:#552222;}#mermaid-svg-f0AsN11XbkV8tqv

weixin_69882801的博客 1201

DebugLZQ:Visual Studio C++ 调试增强工具深度解析

C++ 调试本质是运行时内存状态的精准还原,其核心挑战在于原生调试器对堆管理、智能指针和调用栈的底层信息呈现不足。DebugLZQ 通过 DLL 注入机制绕过 VSIX 沙箱限制,直接对接 Windows 调试子系统,实现对 RtlHeap 堆块、std::shared_ptr 控制块及 x64 .pdata 栈帧的零符号依赖解析。该技术路径不依赖 PDB 或 CLR 元数据,适用于 Release 模式、无调试信息或闭源 SDK 场景,显著缩短内存越界、引用计数竞争与内联函数崩溃等典型问题的定位耗时。本文

diaoqi6581的博客 419

ANTLR4 C++语法解析器实战指南:从入门到深度精通

ANTLR4作为业界领先的语法解析器生成工具,其C++目标实现为开发者提供了高性能的语言识别能力。本文将全面解析ANTLR4 C++的核心架构、实战应用和性能优化策略,帮助开发者快速掌握这一强大的语法解析工具。 ## 项目概述与核心价值 ANTLR4 C++运行时库是一个功能完整的语法解析器生成器实现,支持C++17标准,能够在Windows、macOS、Linux和Android等多平台上运

gitblog_00233的博客 712

llama.cpp tools深度解析:量化、压测与并发性能调优实战

GGUF格式是llama.cpp推理生态的核心容器,其模型量化与性能验证高度依赖原生C++工具链。quantize工具通过分组量化(如Q4_K_M)在精度、显存与延迟间实现工程平衡;llama-bench以硬件级参数(--gpu-layers、--flash-attn)精准定位GPU kernel与内存带宽瓶颈;llama-batched-bench则模拟真实服务负载,暴露多并发下的KV缓存竞争与显存带宽天花板。这些工具共同构成从模型瘦身到生产压测的闭环能力,尤其适用于Windows 11 CUDA部署、S

weixin_33720078的博客 348

从编译错误到完美高亮:RedPanda-CPP 3.2字符串转义字符解析引擎深度优化指南

你是否曾在调试包含复杂转义序列的C++字符串时,因语法高亮失效而浪费宝贵的调试时间?当编译器无情地抛出`invalid escape sequence`错误,而IDE却对明显的转义错误视而不见时,这种工具与开发者之间的"认知鸿沟"往往导致平均30分钟的调试效率损失。RedPanda-CPP 3.2版本针对这一痛点进行了深度优化,本文将系统剖析字符串转义字符语法高亮的实现原理、常见问题及优化方案,帮...

gitblog_07932的博客 463

C++11核心特性解析:右值引用、Lambda与移动语义实战指南

在C++编程中,资源管理和性能优化是核心挑战。传统深拷贝在处理大型对象时开销巨大,而C++11引入的右值引用与移动语义正是为了解决这一问题。其原理是通过识别临时对象(右值),直接转移其资源所有权,避免不必要的复制,从而显著提升程序效率。这项技术的价值在于为现代C++的高性能资源管理奠定了基础,广泛应用于容器操作、智能指针和自定义类设计中。结合可变参数模板,开发者还能实现完美转发,构建类型安全的泛型工厂函数。同时,Lambda表达式以简洁的语法封装可调用对象,极大地简化了回调函数和算法谓词的编写,促进了函数式

weixin_30430169的博客 391

llama.cpp tools目录深度解析:量化、压测与诊断工程实践

GGUF模型部署不是简单加载文件,而是涉及量化压缩、单请求性能基准测试和高并发压力验证的完整工程闭环。量化工具(quantize)通过AWQ变体实现精度可控的INT4转换,直接影响CPU端7B模型能否在8GB内存设备运行;llama-bench提供毫秒级分解计时,精准定位token生成中的cuBLAS计算瓶颈或CPU分词延迟;llama-batched-bench则模拟真实API并发场景,暴露KV cache碎片化、OOM边界等服务端特有风险。这些能力共同构成llama.cpp生产落地的核心技术支撑,广泛应

weixin_33778544的博客 372

Awesome-CPP-CN核心框架库深度解析

Awesome-CPP-CN核心框架库深度解析 本文深度解析了C++生态系统中四个核心框架库:Boost库家族作为C++开发的多功能工具集,提供了超过160个高质量可移植库;Qt框架作为跨平台GUI开发的王者,拥有完整的开发工具链和现代UI框架;Facebook Folly作为高性能C++库的典范,专为大规模分布式系统设计;Dlib作为机器学习与图像处理的利器,提供全面的机器学习算法和计算机视觉功...

gitblog_00751的博客 1053

C++核心问题深度解析:头文件、命名空间、I/O性能与作用域

在C++编程中,理解编译链接机制是构建高质量软件的基础。编译过程将源代码转换为目标文件,而链接器则负责解决符号引用,将多个目标文件合并为可执行程序。这一原理直接关系到代码的组织方式,例如头文件与源文件的分离设计,不仅提升了编译效率,还通过信息隐藏降低了模块间的耦合度。从技术价值看,良好的工程实践能显著提升代码的可维护性和性能表现,尤其在大型项目中更为关键。应用场景涵盖从系统级开发到高性能计算等多个领域。本文聚焦于C++工程实践中的几个核心问题,包括头文件设计、命名空间管理、I/O性能优化(如`endl`与`

weixin_30684743的博客 422

C++跨平台开发:工程难题与解决方案深度解析

本文深入探讨了C++跨平台开发的核心挑战和解决方案。文章从系统API差异、编译器特性、构建系统、运行时环境等多个维度分析了跨平台开发中的典型问题,并提供了具体的技术实现方案。重点内容包括:文件路径编码处理、动态库加载机制、预处理指令差异、标准库实现不一致等问题的解决方案;推荐使用CMake作为构建工具,采用分层架构设计;强调抽象平台差异的重要性,建议优先使用现代C++标准库特性。文章还给出了测试策略、持续集成配置和第三方库集成建议,为开发者提供了全面的跨平台开发实践指南。

csdn_aspnet的专栏,请点击博客主页右上角三个点中的私信联系 5041

C++网络爬虫深度解析与实战应用

C++爬虫是利用C++语言开发的网络爬取工具,它能够自动地访问互联网,并从网页中提取信息。随着互联网数据的指数级增长,爬虫技术变得越来越重要,广泛应用于搜索引擎、市场分析、数据监控等多个领域。本章节介绍了C++爬虫开发中常用的网络库——libcurl和Poco。通过示例代码,我们了解了如何使用这些库来发送HTTP请求、处理响应和异常。下一章节将探讨HTML内容解析技术,让爬虫有能力处理和提取网页中的数据。异步I/O是处理I/O操作的一种机制,它允许I/O操作在不阻塞当前线程的情况下进行。

weixin_36431145的博客 1335

Raize CodeSite 4.4 完整源码深度解析与调试技术实战

CodeSite 不只是一个调试工具,它是现代软件开发中“可观测性(Observability)”理念的完美体现。它教会我们:日志不该是“事后诸葛亮”,而应是“现场直播”;调试不该靠猜测,而应靠证据;性能优化不该凭感觉,而应靠数据驱动。当你第一次在 Listener 中看到那个红色的Exception消息旁边,整齐排列着当时的变量值、调用栈、线程名和自定义字段时,你会明白:这不是工具的进步,而是思维方式的跃迁。所以,别再用调试了。🫣。

weixin_35949153的博客 767

C++核心概念精讲——实战演练与深度解析

本文深入解析C++核心概念,包括转义字符处理、运算符优先级、循环控制优化及数组与指针的进阶技巧。通过实战示例和深度剖析,帮助开发者掌握C++编程中的关键细节,提升代码效率与安全性。特别针对常见误区进行重点讲解,适合中高级开发者进阶学习。

weixin_30074763的博客 331

银河麒麟V11 + KVM/QEMU + GT 710 GPU直通 Win10 完整操作流程文档

宿主机:RTX 5080专门运行ollama大模型服务,通过SSH/VNC远程管理Win10虚拟机:GT 710直通,物理键盘专属,通过物理显示器处理视频应用硬件隔离:两个系统完全隔离,互不干扰,性能最大化两种不同的直通方式直通方式 配置方法 设备在宿主机的状态 典型应用场景PCIe设备直通 vfio-pci.ids=10de:128b,10de:0e0f 设备完全从宿主机消失,被vfio-pci驱动接管 GPU、网卡、NVMe硬盘。

weixin_45285654的博客 1151

http协议详解附带c/c++服务器和客户端源码

本文详解http协议且附带使用代码形式构造http协议与服务器和客户端代码

m0_54069809的博客 2429

Cadence仿真实战:从零构建高精度带隙基准电压源

本文是一份详细的Cadence仿真实战指南,指导读者从零开始构建高精度带隙基准电压源。文章首先解释了带隙基准电压源稳定输出电压的原理,然后逐步演示了在Cadence Virtuoso环境中如何搭建测试电路、测量关键温度系数、计算并搭建核心电路,并通过参数扫描和迭代调优来驯服温度漂移,最终实现低漂移的基准电压输出。

weixin_29207533的博客 242

Android开发者必看:5分钟搞定DeepSeek API接入(附完整代码示例)

本文为Android开发者提供快速接入DeepSeek API的完整指南,包含环境配置、网络层设计、请求体构建等关键步骤,并附有详细代码示例。通过工程化实践,帮助开发者高效集成AI对话、代码生成等高级功能,提升移动应用竞争力。

bush的博客 535
上一篇: C++深度解析 布尔类型bool,三目运算符,引用&(3)
下一篇: C++深度解析 内联函数分析 内联inline和宏#define(5)
mainn
博客等级 码龄10年 865粉丝 447原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值