获得存储是什么意思?

5

[basic.indet] p1 表示:

当获得具有自动或动态存储期的对象的存储时,该对象具有不确定值,如果未对对象执行初始化,则该对象保留不确定值,直到该值被替换。

什么是为对象获取存储空间?考虑以下代码片段:

int a = 0;
new (&a) int;
int对象的存储空间是在new-expression获得时创建的吗?还是在通过定义创建原始对象的存储空间被获取时就已经获取了,或者是当通过new-expression创建对象时获取的?(附注:根据P0593,由于[basic.life] p4,这个新对象将具有不确定的值,但除非认为当第二个对象被创建时,才认为存储空间已被获取,否则这未明确指定)(编辑:这似乎是一个未回答的缺陷报告CWG 1997的主题)

@LanguageLawyer 我猜它是不确定的 :P - Krystian S
2个回答

1

存储空间最初为自动对象分配。然后,placement-new重用该存储空间用于动态对象。

标准似乎没有定义“获得”这个词在分配和重用方面的含义。如果它被限制为与“分配”相同的含义,则它将是一个多余的术语,因此合理地假定它涵盖了分配和重用。

在这种解释下,存储空间将在放置new表达式时被获得。实际上,值将是不确定的。有一个技巧可以保持值:

int a = 0;
int orig = a;
new (&a) int(orig);

一款优秀的优化编译器可以看出这些副本是多余的。对于数组,使用memcpy也可以实现相同的效果,只要长度是恒定的,就可以被优化掉。

1

实际上,它非常简单。来自[expr.new]/8:

通过调用分配函数,新表达式可以为对象获取存储

放置new是一种分配函数。它只能返回与给定指针相同的指针,但此过程仍被视为“获取对象的存储”。该存储是由&a指向的存储。因此,它正如预期的那样工作。当前a正在使用的存储正在被重用。因此,当前的a结束其生命周期,并在相同的存储中开始新的int生命周期。

“获取对象的存储”并不意味着“使之前不存在的存储出现”。它的意思就是如字面所述:为了将对象放置到那里而获得一块存储器。这与仅仅获得一块存储器不同。该存储器可能已经被其他对象使用,但这是无关的。


@KrystianS: 我不明白你的意思。你问这个结构如何为对象获取存储空间。这是通过调用分配函数来完成的。该函数的具体操作并不重要;它返回的存储空间被视为“为对象获得”的,因为它是一个声明“此结构通过执行X来为对象获取存储空间”的结果。 - Nicol Bolas
嗯,也许你的回复只是一个语法错误,我所指的是“它的意思就是:为了把一个对象放在那里而获得一块存储空间。这与仅仅获得一块存储空间不同”。我猜你所说的“get”是指分配。 - Krystian S
@KrystianS:不,我指的是“get”。术语“allocate”暗示着存储器之前不可用或未被使用。这就是为什么标准使用“obtain”而不是“allocate”的原因,因为后者具有并非必然如此的内涵。 - Nicol Bolas
1
由于“get”具有“obtain”的同义词,因此使用它来定义后者并没有真正帮助。更糟的是,在编程上下文中,“get”的含义之一非常特定,即获取已经存在的对象或对象的引用。 - Caleb
@Caleb:“由于get与obtain是同义词,用它来定义后者并没有真正帮助。”这是一个简单的英语单词。它的意思就是字典所说的那样。标准并不想欺骗你;它也没有为“obtain”创造特殊的含义。这就是我的观点。 - Nicol Bolas
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接