gpt4 book ai didi

c++ - 为什么 basic_stringbuf 和 basic_filebuf 移动构造函数具有实现定义的行为?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:11:55 28 4
gpt4 key购买 nike

来 self 的 C++ 标准拷贝 [§27.8.2.1p4]:

basic_stringbuf(basic_stringbuf&& rhs);

Effects: Move constructs from the rvalue rhs. It is implementation-defined whether the sequence pointers in *this (eback(), gptr(), egptr(), pbase(), pptr(), epptr()) obtain the values which rhs had. Whether they do or not, *this and rhs reference separate buffers (if any at all) after the construction. The openmode, locale and any other state of rhs is also copied.

basic_filebuf(basic_filebuf&& rhs);也有类似的句子。

问题

我想知道为什么这是实现定义的?您可能不想复制指针有什么原因吗?

最佳答案

有两种明显的实现技术来处理标准流缓冲区中的缓冲区:

  1. 您可以将缓冲区嵌入到对象中,为对象创建更大的占用空间,但避免为小字符串或文件分配内存。
  2. 您可以指向在堆上分配的缓冲区,并以内存分配为代价处理可能较大的缓冲区。

根据缓冲区所在位置的实现选择,您将需要一组新的指针值,或者您将希望按原样继承指针。这两种策略都不是“更好”的,我也可以想象结合这些策略的变化。因此,实现可以选择而不是做出选择。如果您的问题是为什么实现应该 [忘记] 记录它所做的选择:那显然超出了我的范围。我个人的猜测是假设阶段“是实现定义的”将提供选择的自由,而忽略了实现需要说明其选择的含义(因为有关于引号的辩论:1.3.10 [defns.impl.defined] - 奇怪的是没有段落编号)。

关于c++ - 为什么 basic_stringbuf 和 basic_filebuf 移动构造函数具有实现定义的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13169344/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com