临时对象:术语澄清
Temporary object: Clarification in terminology
调用函数时,除非编译器使用优化,否则将返回一个临时对象。 可以在 2 个位置创建临时对象: 1( 堆栈 2( 中央处理器寄存器 . 计算机科学中的术语对象实际上表示一个变量,一个内存位置,其中包括所有实例变量,其定义发生在随后创建对象的类中。 在这里,我问我的问题: CPU 寄存器是处理器内部的变量,因此在 RAM 级别找不到。 当我使用这样的表达式时:"临时对象是在CPU寄存器内创建的",我的意思是说寄存器充当临时对象,还是对象是在寄存器中创建的?
作为一个CPU寄存器,一个变量,它应该包含值,从而充当临时对象。 澄清我的想法。
当我使用这样的表达式时:"临时对象是在 CPU 寄存器内创建的",我的意思是说寄存器充当临时对象,还是对象是在寄存器中创建的?
这似乎是一个相当无意义的区别,尽管第二个措辞最清晰,最惯用。
但我根本不会使用这个表达方式。在运行时是否在执行计算上"创建"任何对象完全取决于编译器,基于其在编译过程中的决策过程,有时无法提前有效预测。
没有硬性规定您的编译程序将包含将所有临时变量放入寄存器的指令,也没有硬性规则规定您的编译程序将包含将所有临时变量放在调用堆栈上的指令。
C++不是源代码语句到计算机指令的一对一映射;它是一种抽象。
这也适用于非临时人员。如果对象在运行时不需要实际"存在于"内存中的某个地方,那么您编译的程序可能只是跳过该步骤(或"优化它"(。那就是它是否有名字。但是,如果您曾经获取对象的地址,这将成为问题,因此通常不会发生;您不能获取临时地址,以便特定约束不会出现在那里。也许这就是为什么人们认为临时性是"更可优化的"。
但是说"临时人员进入登记册"是错误的;你太远了几层抽象,以至于它作为任何经验法则都没有意义。
CPU 寄存器是处理器内部的变量,因此在 RAM 级别找不到
它们仍然只是"内存空间",就像您的RAM位一样。我建议您尽量避免将寄存器视为编程代码意义上的变量来混淆自己。
作为一个CPU寄存器,一个变量,它应该包含值,从而充当临时对象。
当然,但在编译时你呼到显示器上的呼吸也是一个临时对象。这同样与"临时对象"无关,因为C++的意思是它。
在 C/C++ 中,register int foo
可以是没有地址的对象。 (你不能在 C 中获取register
变量的地址,即使是原始编译器也可以将其保存在寄存器中;优化编译器可以为任何未获取地址的变量或加载和存储之间的其他变量执行此操作可能使它们别名(。
简单可复制类型的返回值对象类似于当它们足够小,以便调用约定在寄存器或寄存器对中返回时。
(在C++中,不可复制类型的复制构造函数和析构函数确实会看到返回值对象的地址,这就是大多数调用约定不会在寄存器中返回此类类型的原因。
我的意思是说寄存器充当临时对象,还是在寄存器中创建对象?
对象(例如int
或int*
(存储在寄存器中。
每个对象都有一个"对象表示",即表示其值的某种格式的位束。 它通常存储在对象的地址,但可以暂时存储在寄存器中,或者在对象的整个生命周期内存储。
- 在不复制临时对象的情况下延长其生存期
- 为什么当我们有常量引用时创建临时对象?
- 程序如何'remember'临时对象?
- 返回对临时对象的引用
- 防止临时对象文件访问 MSVC 中的磁盘
- 是否可以在C++中移动临时对象的属性?
- 通过引用传递临时对象
- 临时C++对象是否为左值?
- 临时对象:术语澄清
- 存储对(可能)临时对象的引用是否合法,只要引用不比对象存活?
- 临时对象有身份吗?
- 临时对象上的运算符重载
- 如何在没有 std::move 的情况下移动临时对象
- 临时对象在C++中是不可避免的吗?
- 编译错误:临时对象构造函数中缺少参数
- 为什么在按值返回时创建临时对象,而不是在按值传递给函数参数时创建临时对象
- 我试图创建临时对象的方式有错误吗
- 子表达式中临时对象的生存期
- 对临时对象的Const引用不会延长其生存期
- 为什么引用类型在使用临时对象访问时是左值