C++引用不能绑定到临时数据
我们知道,指针就是数据或代码在内存中的地址,指针变量指向的就是内存中的数据或代码。这里有一个关键词需要强调,就是内存,指针只能指向内存,不能指向寄存器或者硬盘,因为寄存器和硬盘没法寻址。
其实 C++ 代码中的大部分内容都是放在内存中的,例如定义的变量、创建的对象、字符串常量、函数形参、函数体本身、new或malloc()分配的内存等,这些内容都可以用&来获取地址,进而用指针指向它们。除此之外,还有一些我们平时不太留意的临时数据,例如表达式的结果、函数的返回值等,它们可能会放在内存中,也可能会放在寄存器中。一旦它们被放到了寄存器中,就没法用&获取它们的地址了,也就没法用指针指向它们了。
下面的代码演示了表达式所产生的临时结果:
这些表达式的结果都会被放到寄存器中,尝试用&获取它们的地址都是错误的。
int n = 100, m = 200;
int *p1 = &(m + n); //m + n 的结果为 300
int *p2 = &(n + 100); //n + 100 的结果为 200
bool *p4 = &(m < n); //m < n 的结果为 false
#include <iostream>
using namespace std;int main() {int n = 100, m = 200;int *p1 = &(m);return 0;
}
什么样的临时数据会放到寄存器中
寄存器离 CPU 近,并且速度比内存快,将临时数据放到寄存器是为了加快程序运行。但是寄存器的数量是非常有限的,容纳不下较大的数据,所以只能将较小的临时数据放在寄存器中。int、double、bool、char 等基本类型的数据往往不超过 8 个字节,用一两个寄存器就能存储,所以这些类型的临时数据通常会放到寄存器中;而对象、结构体变量是自定义类型的数据,大小不可预测,所以这些类型的临时数据通常会放到内存中。
C++引用不能绑定到临时数据相关推荐
- 解决 WPF 绑定集合后数据变动界面却不更新的问题(使用 ObservableCollection)
解决 WPF 绑定集合后数据变动界面却不更新的问题 独立观察员 2020 年 9 月 9 日 在 .NET Core 3.1 的 WPF 程序中打算用 ListBox 绑定显示一个集合(满足需求即可, ...
- 解决 WPF 绑定集合后数据变动界面却不更新的问题
解决 WPF 绑定集合后数据变动界面却不更新的问题 独立观察员 2020 年 9 月 9 日 在 .NET Core 3.1 的 WPF 程序中打算用 ListBox 绑定显示一个集合(满足需求即可, ...
- 引用内部函数绑定机制,R转义字符,C++引用,别名,模板元,宏,断言,C++多线程,C++智能指针
1.引用内部函数绑定机制 #include<iostream> #include<functional> usingnamespacestd; usingnamespac ...
- [WPF 基础知识系列] —— 绑定中的数据校验Vaildation
[WPF 基础知识系列] -- 绑定中的数据校验Vaildation 原文:[WPF 基础知识系列] -- 绑定中的数据校验Vaildation 前言: 只要是有表单存在,那么就有可能有对数据的校验需 ...
- 常亮左值引用可以绑定右值的原因
相关文章: 为什么常量左值引用可以绑定到右值? 根据该问题的几位答主的回答,整理成个人的理解. 从设计初衷上讲 允许引用绑定非左值的初衷在于"让传值还是传引用成为函数本身的细节,调用者不用去 ...
- Spark的临时数据不自动清理
前言 本文隶属于专栏<Spark异常问题汇总>,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见 Spark异常问题汇总 正文 在处 ...
- C++ const关键字的总结(全局/局部变量、修饰指针和引用、成员函数和数据成员、修饰类对象、const与宏定义的区别、Static与Const的区别)
const关键字 const关键字 1.什么是const 2.使用原理 2.1.const全局/局部变量 2.2.cosnt修饰指针和引用 2.3.const修饰函数参数 2.4.const修饰函数返 ...
- java bean 绑定,在 Java 应用程序中绑定 Bean 和数据
将组件绑定到表示数据的 Bean 本节介绍如何将数据绑定到 JTable.JList 和 JComboBox 组件. 将一个数据库表添加到窗体,并自动生成 JTable 以显示数据库表的内容: 打开 ...
- repeater用法一步一步详讲,用来绑定和显示数据信息
估计要分两部: 一部分UI部分:在一个div里面可以写个repeater服务器控件,用来横排显示需要的数据:<asp:Repeater id="" runnat=" ...
最新文章
- 【David Silver强化学习公开课】-6:Value Function Approximation
- C语言 链表 头插法
- Linux中Buffer和Cache的区别
- ASP.NET Core 中使用IHttpClientFactory发出HTTP请求
- 使用Newtonsoft.Json格式化JSON文档
- 华为隐藏功能扩大内存代码大全_发现将华为手机这3个功能打开,竟然可以将手机性能极限发挥...
- 广安a货翡翠,自贡a货翡翠
- java鼠标右击出现选择窗口_java菜单代码 java中鼠标右击弹出菜单怎样实现
- Extjs4循序渐进(一)——开始Ext
- 危险无处不在 Html标签带来的安全隐患
- CorelDRAWX4的VBA插件开发(九)循环的套用和统一尺寸
- 量子通讯加密技术的技术原理
- SC-GlowTTS论文阅读
- java uint64_Java 中的 uint64
- Python之ASCII码相关
- 百度短网址URL生成
- 【生活记录】松江区驾驶证到期续办(上海)
- 机器学习笔试题精选(六)
- Windows添加开机和关闭开机启动项
- 1219. 黄金矿工
热门文章
- day10 局部变量 全局变量 作用域前奏
- Linux常用命令——tar
- IE下checkbox或radio隐藏bug
- nagios安装与配置详解1
- 【转载】Android数据库(SqlLite)操作和db文件查看
- 本地安装jruby到maven仓库,由于公司网络不给力
- PAT甲级1100 Mars Numbers:[C++题解]进制位、使用stringstream类读入
- PAT甲级1005 Spell It Right :[C++题解]字符串处理
- leetcode 752. 打开转盘锁 c代码
- linux下的代码比较工具下载,linux下的代码工具比较