问题标签 [temporary-objects]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 使用临时对象获取 STL 容器的迭代器时的细微错误:如何避免?
让我们考虑这个类:
和这个错误的代码:
错误的部分是,在Statement 1
and中Statement 2
,我得到了一个临时对象的迭代器,该对象将在每个语句的末尾被销毁。结果,for()
循环内的行为是未定义的。
该方法的正确用法getTheMap()
是这样的:
必须注意的是,类X
有一些严重的设计问题:
_map
应该更好地封装在类内部(用于读写访问),因此getTheMap()
可以避免该方法- 如果
getTheMap()
确实需要该方法,它可以返回对_map
但是,给定 X 类“原样”(<-- 请参阅下面的编辑),有没有办法阻止用户将迭代器获取到临时的?
编辑:类X
可以更改,但getTheMap
方法应该存在并按值返回。但是我也在考虑编译器警告。
c++ - 临时的赋值和引用初始化
假设我有以下内容:
最后一行包含:
- 一个临时构造的实例
someValueType
- 将临时分配到新的地图条目中
- 初始化对映射条目的引用
所以如果下一行是:
这将尝试更改地图条目对吗?不是原来临时的?
我知道在这种情况下,如果引用不能取临时值,因为它是非 const (所以编译器错误或没有一个会回答我的问题),但如果我将 const 添加到引用声明中,我不是确定在这种情况下评估规则会说什么
c++ - 函数返回的临时对象不总是 r 值吗?
输出是:复制
*f()
显然是一个匿名临时对象,因此它应该是一个 r 值并且应该调用移动构造函数。为什么编译器将*f()
其视为左值?
是编译器的错误,还是我的理解错误?
c++ - 临时对象——它们是什么时候创建的,你如何在代码中识别它们?
在 Eckel,第 1 卷,第 367 页
为什么会f5() = X(1)
成功?这里发生了什么???
Q1。当他这样做X(1)
的时候——这里发生了什么?这是一个构造函数调用吗-不应该然后阅读X::X(1);
它是类实例化吗-类实例化不是类似于:X a(1);
编译器如何确定什么
X(1)
是?我的意思是..名称装饰发生所以..X(1)
构造函数调用将转换为:globalScope_X_int
作为函数名称.. ???
Q2。当然,临时对象用于存储X(1)
创建的结果对象,然后将其分配给对象f5()
返回(这也将是一个临时对象)?鉴于f5()
返回一个将很快被丢弃的临时对象,他如何将一个常量临时分配给另一个常量临时?有人可以清楚地解释为什么:
f7(f5());
应该导致一个持续的临时性而不是简单的旧f5();
c++ - 将 temp 分配给 const ref 成员会导致分段错误
通过一个例子更好地解释:
托克.h
主文件
程序打印 0 这是错误的。实际代码出现段错误。
我希望延长分配给 const 引用的 temp 的生命周期的规则在这里会成立,但显然不是。你知道原因吗?
c++ - 将临时对象保存在寄存器中以避免虚拟机中的额外存储/加载?
标题可能有点不清楚,所以在这里澄清一下:
问题:
在我的实现中解决了这两个“指令”
我目前正在使用临时对象来存储临时值,这要求将临时值存储在 RAM 中并在需要时再次获取它,这两者都不是真正需要的并且性能较低。
我正在用 C++ 实现 VM,所以我的问题是是否有一些可移植的方法来避免将临时值存储到主内存中,但将它们保存在实际的 CPU 寄存器中?
我已经使用register
关键字进行了一些测试,但是从性能改进的不足来看,我会说编译器忽略了它。
作为最后的手段,我愿意进行平台特定的组装,但我对这个主题几乎一无所知,所以如果这是唯一可能的方法,欢迎提供好信息。我确实意识到我给出的这个例子是一个基本的例子,它很可能会遇到需要大量临时对象的情况,在这种情况下应该有一些方法来确定要使用和使用多少寄存器其余的内存存储...
也许有一些方法可以要求寄存器存储,如果编译器“用完”寄存器,自动将临时压入堆栈?就我对汇编的熟悉程度而言,您可以通过名称“寻址”特定寄存器,而我不清楚编译器究竟如何处理潜在的寄存器使用冲突......
select - 我可以在 SQL 的 Select 语句中临时存储一个值吗?
在我的 select 语句中,我有两个计算结果。它看起来像这样:
一旦我在选择中有这五个语句,我希望能够将 E-Premium + F-Premium 总计到一个新列中。我总是可以这样做:
...但这似乎是相当草率和笨重。有没有办法存储个人保费,这样我就可以做一个简单的CAST((F-Premium + E-Premium) AS DECIMAL(38,2)) 'Total Premium'
笨重的方式也不会让 F-Premium 和 E-Premium 保持动态,因此如果我更改它们的计算方式,我还必须更改 Total Premium 列中的计算。
使用 Microsoft SQL Server Management Studio 2010
c++ - C ++返回临时对象混乱
我有一个相当基本的 C++ 问题:考虑一个函数,它接受一些输入参数并std::string
从这些参数创建一个,如下所示:
我知道stringstream
当函数返回时对象将超出范围,但这不会使构造的字符串也无效吗?
如果我将返回类型更改为const char *
并返回,会发生什么ss.str().c_str()
?
上面的代码似乎可以工作,但我怀疑这只是因为包含“临时”对象的内存在我使用它时还没有被其他东西覆盖?
我不得不承认,一般来说,我在这种情况下很困惑。如果有人可以向我解释这整个“临时对象”的事情(或者只是指出我正确的方向),我将不胜感激。
c++ - 临时对象创建
有谁知道是否可以在任何符合 C++ 的编译器(Visual Studios、g++ 等)上启用任何类型的日志记录,以便我可以发现何时创建临时对象?
例如:
假设我有一个函数f(char x)
,但我称之为f(46)
我会在日志中看到——
temporary char created promoting int @ function param f(46)
(或类似的东西)
我已通读 VS 编译器开关选项,看来这不是一个选项。
我知道在新标准中有一个rvalue reference
(&&) 的概念,可用于检测大多数临时移动语义,但这涉及添加新代码/兼容编译器。
那么这可以做到吗?或者这是编译器的特权知识?