【问题标题】:Is object existence distinct from object lifetime?对象存在与对象生命周期不同吗?
【发布时间】:2020-02-26 07:35:10
【问题描述】:

这听起来很哲学,但事实并非如此:在 C++ 中,各种(类、标量)对象存在在它们的生命周期之外吗?对象的存在是什么?什么是对象的创建?对象是否在其生命周期开始时创建?

(为清楚起见进行了编辑:问题并非专门针对类类型。)

我非常困惑,需要有人向我解释术语和基本概念。

注意:存在就是存在的事实。这是最基本的哲学概念。它不是对象的属性,我不知道也不关心标准文本中“存在”一词的出现次数。教科书可能很少说事物“存在”。我不记得曾经读过寄存器中“存在”的数字或源代码中“存在”的表达式。数字适合寄存器,源代码中有表达式。

如果我们可以引用一个对象,这意味着它存在。如果指针指向一个对象,则该对象存在。

【问题讨论】:

  • @L.F. “你能提供一个例子来说明“存在”这个词在标准中是如何使用的吗?” 这有什么相关性? “要解释存在,存在就应该存在” 不,存在是存在的概念。 你相信存在是一个对象的属性吗?你谈论不存在的东西吗?任何东西,也就是说,根据定义,我们谈论的任何想法都存在

标签: c++ constructor language-lawyer terminology object-lifetime


【解决方案1】:

这最好用[intro.object]/1来理解:

当隐式更改联合的活动成员或创建临时对象([conv.rval]、[class.temporary])时,通过定义、新表达式创建对象。一个对象在其构建期间([class.cdtor])、在其整个生命周期以及在其销毁期间([class.cdtor])占用一个存储区域。

第二句话回答了你的问题。如果一个对象能够占据描述为“其生命周期”之外的存储区域(例如在其构建和销毁期间),那么显然一个对象必须能够在其生命周期之外存在 .

【讨论】:

  • "你引用的声明" 我没有引用任何声明。
  • 我对自动变量不感兴趣,但对存在持续时间不太清楚的对象感兴趣。
  • 这意味着malloc(sizeof(plain_old_data_t)) 永远不会创建任何符合 C++ 对象定义的东西。标准保证可以轻松复制且没有填充位或陷阱表示的类型之一可能是一个更好的例子。
  • @Davislor:它没有“暗示”任何东西;这些是创建对象的唯一 C++ 构造。就 C++ 标准而言,malloc 不会创建任何对象。或者至少,按照目前的标准; [有计划改变它](wg21.link/P0593)。
  • @NicolBolas 嗯,是的,但是否会有malloc() 需要放置new 才能工作的实现?我想如果你想绝对且严格地兼容 C++17,并使用从 C 风格分配器获得的内存,那就是你必须要做的。
【解决方案2】:

C++ 中的对象是一个抽象概念。对于机器码来说,它只是一个很大的虚拟字节数组。

物理“对象”是内存中的一堆字节,它们被分配用于某种目的,并与一些作用于这些字节的函数相关联。该对象的生命周期是这些字节用于该对象的目的的时间,以及它们不再被使用的时间。之后它们仍然存在,但可供其他对象使用。

【讨论】:

  • 最后它们只是内存中的字节,但在抽象层面,它们不止于此;抽象机器依赖于抽象语义。
  • 我太笨拙了,不能那样想。对我来说,生命周期甚至不是抽象机器的一部分,它只是静态分析器等的指标。在抽象层面上,我会说如果周围没有人,那棵树就不会发出声音。该对象在程序初始化它之前不存在,并且在程序停止关心它之后它不再存在。这样生活更轻松。
  • 整个 C++ 标准似乎是围绕生命周期构建的,这是一个定义不明确的概念......
  • 这很公平。如果我有 198 瑞士法郎,我就可以查一下。
  • 在 C++ 中,说一个对象存在意味着不仅仅是为它分配的内存字节。字节可能会继续存在,但对象不会。
猜你喜欢
  • 2018-09-18
  • 2011-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多