C++深度解析教程笔记3

C++深度解析教程笔记3

  • 第5课 - 引用的本质分析
    • 实验-const引用
    • 实验-引用的本质
    • 实验-引用所占空间大小
      • vs2010反汇编
    • 实验-局部变量的引用
    • 小结
  • 第6课 - 内联函数分析
    • 实验-内联函数
      • 设置允许编译器内联
    • 实验-forceinline
    • 小结

本文学习自狄泰软件学院 唐佐林老师的 C++深度解析教程,图片全部来源于课程PPT,仅用于个人学习记录

第5课 - 引用的本质分析

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

实验-const引用

#include <stdio.h>

void Example()
{
    printf("Example:\n");
    
    int a = 4;
    const int& b = a;
    int* p = (int*)&b;
    
   // b = 5;
/*
E:\test>c++ 5-1.cpp
5-1.cpp: In function 'void Example()':
5-1.cpp:11:9: error: assignment of read-only reference 'b'
     b = 5;

*/
    
    *p = 5;
    
    printf("a = %d\n", a);
    printf("b = %d\n", b);
// 注释*p = 5; 
//a = 4
//b = 4
//不注释*p = 5; 
//a = 5
//b = 5
}

void Demo()
{
    printf("Demo:\n");
    
    const int& c = 1;
    int* p = (int*)&c;
    
    //c = 5;
/*
E:\test>c++ 5-1.cpp
5-1.cpp: In function 'void Demo()':
5-1.cpp:33:9: error: assignment of read-only reference 'c'
     c = 5;
*/
    
    //*p = 5;
    
    printf("c = %d\n", c);
//  //*p = 5;  output :c = 1
//     *p = 5;  output :c = 5               
}

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

    return 0;
}

在这里插入图片描述

实验-引用的本质

#include <stdio.h>

struct TRef
{
    char& r;
};

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

    return 0;
}
/*
cmd g++:
sizeof(char&) = 1
sizeof(rc) = 1
sizeof(TRef) = 8
sizeof(ref.r) = 1
codeblock:
sizeof(char&) = 1
sizeof(rc) = 1
sizeof(TRef) = 4
sizeof(ref.r) = 1


*/

在这里插入图片描述

实验-引用所占空间大小

#include <stdio.h>

struct TRef
{
    char* before;
    char& ref;
    char* after;
};

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)); //4+1+4 X
    printf("sizeof(r.before) = %d\n", sizeof(r.before));//4 ?
    printf("sizeof(r.after) = %d\n", sizeof(r.after));//4?
    printf("&r.before = %p\n", &r.before);//
    printf("&r.after = %p\n", &r.after);//
    printf("r.before = %p\n", r.before);//4
    printf("r.after = %p\n", r.after);//

    return 0;
}
/*
g++ cmd:
sizeof(r) = 24
sizeof(r.before) = 8
sizeof(r.after) = 8
&r.before = 000000000061FDF0
&r.after = 000000000061FE00
r.before = 000000000061FE17
r.after = 000000000061FE16
DF0 与E00 差16  ;sizeof(r.before) = 8,说明引用占的存储空间为8个字节
24-8-8=8;说明引用占的存储空间为8个字节

codeblock(32):
sizeof(r) = 12
sizeof(r.before) = 4
sizeof(r.after) = 4
&r.before = 0060FEEC
&r.after = 0060FEF4
r.before = 0060FEFB
r.after = 0060FEFA
EC 与F4 差8  ;sizeof(r.before) = 4,说明引用占的存储空间为4个字节
12-4-4=4;说明引用占的存储空间为4个字节

*/

vs2010反汇编

    char a = 'a';
00E836DE  mov         byte ptr [a],61h  //将97放到名称为a的一个字节的内存空间
    char& b = a;
00E836E2  lea         eax,[a]  //将a的地址取出,放到eax寄存器中
00E836E5  mov         dword ptr [b],eax  //将eax中的内容,放入b标识符对应的内存空间 大小为4个字节(dword)

实验-局部变量的引用

#include <stdio.h>
//返回引用,局部变量
// warning: reference to local variable 'd' returned [-Wreturn-local-addr]
    // int d = 0;
int& demo()
{
    int d = 0;

    printf("demo: d = %d\n", d);

    return d;
}
//返回引用,静态变量
int& func()//int * const
{
    static int s = 0;

    printf("func: s = %d\n", s);

    return s;
}

int main(int argc, char* argv[])
{
    int& rd = demo();
    int& rs = func();

    printf("\n");
    printf("main: rd = %d\n", rd);
    printf("main: rs = %d\n", rs);
    printf("\n");

    rd = 10;
    rs = 11;

    demo();
    func();

    printf("\n");
    printf("main: rd = %d\n", rd);
    printf("main: rs = %d\n", rs);
    printf("\n");

    return 0;
}
/*
demo: d = 0
func: s = 0

main: rd = 1980251346  //野指针
main: rs = 0

demo: d = 0
func: s = 11

main: rd = 1980251346  //rd代表的内存空间无意义
main: rs = 11
*/

小结

在这里插入图片描述

第6课 - 内联函数分析

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实验-内联函数

在这里插入图片描述

    int c = func(++a, b);
001536EC  mov         eax,dword ptr [a]  
001536EF  add         eax,1  
001536F2  mov         dword ptr [a],eax  
001536F5  mov         ecx,dword ptr [b]  
001536F8  push        ecx  
001536F9  mov         edx,dword ptr [a]  
001536FC  push        edx  
001536FD  call        func (1511DBh)  //编译器未允许内联请求
00153702  add         esp,8  
00153705  mov         dword ptr [c],eax 

设置允许编译器内联

在这里插入图片描述
在这里插入图片描述

实验-forceinline

//vs2010
#include <stdio.h>

__forceinline   //vs2010 设置内联函数扩展
//__attribute__((always_inline))//gcc
//inline 与 __forceinline作用一样
int add_inline(int n);

int main(int argc, char *argv[])
{
    int r = add_inline(10);

    printf(" r = %d\n", r);

    return 0;
}

inline int add_inline(int n)
{
    int ret = 0;

    for(int i=0; i<n; i++)
    {
        ret += i;
    }

    return ret;
}
    int c = func(++a, b);
00271036  mov         eax,dword ptr [a]  
00271039  add         eax,1  
0027103C  mov         dword ptr [a],eax  
0027103F  mov         ecx,dword ptr [a]  
00271042  cmp         ecx,dword ptr [b]  
00271045  jge         main+3Fh (27104Fh)  
00271047  mov         edx,dword ptr [a]  
0027104A  mov         dword ptr [ebp-10h],edx  
0027104D  jmp         main+45h (271055h)  
0027104F  mov         eax,dword ptr [b]  
00271052  mov         dword ptr [ebp-10h],eax  
00271055  mov         ecx,dword ptr [ebp-10h]  
00271058  mov         dword ptr [c],ecx  

在这里插入图片描述
在这里插入图片描述

//内联不成功
    int r = add_inline(10);
0010101C  push        0Ah  
0010101E  call        add_inline (10100Ah)  
00101023  add         esp,4  
00101026  mov         dword ptr [r],eax  

//内联成功
    int r = add_inline(10);
0026102C  mov         dword ptr [ebp-8],0  
00261033  mov         dword ptr [ebp-0Ch],0  
0026103A  jmp         main+35h (261045h)  
0026103C  mov         eax,dword ptr [ebp-0Ch]  
0026103F  add         eax,1  
00261042  mov         dword ptr [ebp-0Ch],eax  
00261045  cmp         dword ptr [ebp-0Ch],0Ah  
00261049  jge         main+46h (261056h)  
0026104B  mov         ecx,dword ptr [ebp-8]  
0026104E  add         ecx,dword ptr [ebp-0Ch]  
00261051  mov         dword ptr [ebp-8],ecx  
00261054  jmp         main+2Ch (26103Ch)  
00261056  mov         edx,dword ptr [ebp-8]  
00261059  mov         dword ptr [r],edx  

在这里插入图片描述

小结

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/582572.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

做私域不止是积累流量,生态也很重要!

如今&#xff0c;私域流水占比已经逼近整个零售市场的30%&#xff0c;达到4万亿规模&#xff0c;百度、阿里、腾讯等头部玩家也都在加速布局&#xff0c;私域运营&#xff0c;已不再是一个单一的商业模式或者运营手段&#xff0c;而是逐渐构成一种可持续的行业生态。 一、什么…

el-form 表单设置某个参数非必填验证

html <el-form ref"form" :rules"rules"><el-form-item prop"tiktokEmail" label"邮箱" ><el-input v-model"form.tiktokEmail" placeholder"邮箱" ></el-input></el-form-item&…

Docker-容器的前世今生

文章目录 Docker为什么产生&#xff1f;硬件虚拟化硬件虚拟化解决的问题硬件虚拟化定义硬件虚拟化技术虚拟机的优点虚拟机的缺点 操作系统虚拟化即容器容器化解决的问题容器化定义容器化技术历史 容器和虚拟机对比 Docker的发展历史Docker架构客户端服务端仓库Registry Docker重…

民航电子数据库:mysql与cae(insert语法差异)

目录 示例1、cae插入数据时不支持value关键字&#xff0c;只能使用values2、insert时&#xff0c;就算是自增主键&#xff0c;只要新增时包含了主键&#xff0c;该主键就必须有值&#xff0c;否则会报错&#xff1a;字段xxx不能取空值 对接民航电子数据库&#xff0c;本篇记录i…

循环购模式:引领消费新潮流,共创商业新生态

大家好&#xff0c;我是吴军&#xff0c;今天我想和大家分享一个独特而富有吸引力的商业模式——循环购模式。这是一种融合了消费返利与积分机制的新型购物体验&#xff0c;它为消费者和商家带来了前所未有的互动机会。 在循环购模式的运作下&#xff0c;消费者的每次购物都伴随…

OSPF大作业

一&#xff0c;拓扑 二&#xff0c;要求 1&#xff0c;r4为ISP上只配ip&#xff0c;r3与其他设备之间只使用公有IP 2&#xff0c;r3-r5/6/7为MGRE环境&#xff0c;r3为中心 3&#xff0c;整个OSPF的ip地址基于172.16.0.0/16划分 所以设备都可以访问r4的环回 4减少LSA的数量加快…

【转载】C++代码中将函数返回类型后置有啥好处吗

C代码中将函数返回类型后置有啥好处吗&#xff1f; 内容如下&#xff1a; C代码中将函数返回类型后置有啥好处吗&#xff1f; 这种语法是 C11 新增的&#xff0c;学名叫 trailing return type[1]。翻译过来是后置返回类型&#xff0c;trailing 是后面的、拖尾的意思。书写 int …

质量管理,怎能不知道SPC?

SPC&#xff08;统计过程控制&#xff09;是质量管理的一个重要组成部分&#xff0c;它可以帮助企业更好地控制生产过程、提高产品质量、降低生产成本、增强企业的竞争力。 SPC是一种应用统计技术对过程中的各个阶段进行评估和监控&#xff0c;建立并保持过程处于可接受的并且稳…

深入理解Linux调试工具eBPF和strace、内存泄漏处理、Kubernetes容器调试以及C++协程的崩溃信息收集

在软件开发领域&#xff0c;无论是初级开发者还是资深工程师&#xff0c;都需要面对复杂的调试工作。本文将介绍几个重要的调试工具和技术&#xff0c;并提供实际调试方法的指导&#xff0c;包括Linux环境下的eBPF和strace&#xff0c;内存泄漏问题的处理&#xff0c;Kubernete…

020Node.js的FS模块使用fs.mkdir创建目录

Node.js的FS模块使用fs.mkdir创建目录 //fs.mkdir 创建目录 /*path 将创建的目录路径mode 目录权限&#xff08;读写权限&#xff09;&#xff0c;默认777callback 回调&#xff0c;传递异常参数err*/ const fsrequire(fs);fs.mkdir(./css,(err)>{if(err){console.log(err)…

时间序列模型(含python程序实现)

常用按时间顺序排列的一组随机变量来表示一个随机事件的时间序列&#xff0c;简记为 用表示该随机序列的n个有序观察值&#xff0c;称之为序列长度为n的观察值序列。 常用的时间序列模型 时间序列的预处理 拿到一个观察值序列后&#xff0c;首先要对它的纯随机性和平稳性进行…

PC-3000 Mobile Pro: 智能手机及平板设备数据提取及取证工具

天津鸿萌科贸发展有限公司从事数据安全业务20余年&#xff0c;在数据恢复、数据取证、数据备份等领域有丰富的案例经验、前沿专业技术及良好的行业口碑。同时&#xff0c;公司面向取证机构及数据恢复公司&#xff0c;提供数据恢复实验室建设方案&#xff0c;包含数据恢复硬件设…

书生·浦语 大模型(学习笔记-9)大模型微调的相关概念 预训练 与 微调 全量微调FFT 与 PEFT的区别

目录 一、什么是大模型微调 二、指令微调 三、微调的目的 三、微调的方式 四、微调的步骤 五、微调数据准备 六、微调的数据质量 一、什么是大模型微调 预训练和微调的区别&#xff0c;这个很关键 二、指令微调 这个地方主要是微调的角度不同&#xff0c;简单理解&#…

linux jmeter ant下载并安装【2024-亲测】

环境 centos7 一、下载jmeter 在这里插入代码片wget https://dlcdn.apache.org//jmeter/binaries/apache-jmeter-5.6.3.tgz --no-check-certificate解压 tar -zxvf apache-jmeter-5.6.3.tgz复制到安装目录、设置环境变量 vim /etc/profile添加环境变量&#xff0c;路径改成…

YOLOv8: 快速而准确的对象检测

YOLOv8: 快速而准确的对象检测 背景 对象检测是计算机视觉中的一个关键任务,它可以帮助我们在图像或视频中识别和定位感兴趣的物体。其中,YOLO(You Only Look Once)系列是一类非常出色的实时对象检测算法,以其快速和准确的特点而闻名。YOLOv8是YOLO系列的最新版本,由Ultralyti…

【ESP32S3】使用 Flash 下载工具完成 Flash 加密功能

此篇文档记录通过 Flash 下载工具 完成 Flash 加密 功能的实现&#xff0c;此文档不启用 Flash 加密方案的 NVS 加密。 Flash 加密启动的验证代码&#xff1a;esp-idf/components/bootloader_support/src/flash_encrypt.c Flash 加密测试例程&#xff1a;esp-idf/examples/sec…

【yolov8目标检测部署】TensorRT int8量化

原作者github&#xff1a;https://github.com/xuanandsix/Tensorrt-int8-quantization-pipline/tree/main 改进&#xff1a; 源代码支持的TensorRT版本为7.许多属性已经弃用&#xff1b; 在原有的代码上将支持的TensorRT版本从7改到8. &#xff01;&#xff01;不知道如何安装T…

酷得电子机器狗玩具 MCU方案介绍

机器狗是一种多功能、互动性强的机器人&#xff0c;适合家庭和学校环境。它不仅可以陪伴孩子们玩耍&#xff0c;还能帮助他们学习和成长。功能如下&#xff1a; 关节可动&#xff1a;机器狗的关节设计灵活&#xff0c;可以执行各种动作&#xff0c;如“坐下”、“俯卧撑”、“…

【Ant-Desgin-React 步骤条】步骤条配合组件使用

步骤条配合组件使用 基础使用多分组进度 基础使用 /* eslint-disable no-unused-vars */ import React, { useState } from react import { Button, message, Steps, theme } from antd import After from ./components/after import Now from ./components/now const steps …

纯js对比excel小工具

如何使用JavaScript和xlsx.js实现Excel文件对比&#xff1a;实战指南 在日常办公或数据分析工作中&#xff0c;我们经常需要比较两个Excel文件中的数据差异。手动对比不仅耗时费力&#xff0c;还容易出错。本文将带你通过一个简单的网页应用&#xff0c;利用JavaScript和开源库…