gpt4 book ai didi

c++ - 字符串 move 构造函数如何工作?

转载 作者:行者123 更新时间:2023-11-30 05:48:02 25 4
gpt4 key购买 nike

我正在阅读一本关于 C++ 的书,试图学习这门语言。在这个示例中,它创建了一个类似 vector 的类,该类仅适用于名为 stringV 的字符串。该类定义了一个名为 reallocate 的函数,该函数应分配新的动态内存并将其字符串 move 到新内存,以防旧内存已满。

void stringV::reallocate(){
size_t newcap = size() ? size() * 2 : 1;
auto newalloc = alloc.allocate(newcap);
auto mem = newalloc;
auto elem = element; // element pointes to the first string object in the memory segment
for (size_t i = 0; i < size(); i++){
alloc.construct(newalloc, std::move(*elem));
newalloc++;
elem++;
}
free(); //destroys and deallocates the dynamic memory held by this object
element = mem;
first_free = newalloc; // one past the last element
cap = element + newcap; // last part of the possibly unconstructed memory

}

根据书中所述,该函数使用字符串类的 move 构造函数,通过交换字符串对象之间的指针来窃取传递给它的对象的状态(我假设它是指向第一个元素的指针,类似于内置的-在数组中)而不是单独复制每个字符。例如,假设我们有一个名为 foostringV 对象,它已为 3 个字符串分配了足够的动态内存。我们首先分配字符串 "one""two""three"。现在当我们尝试压入第四个字符串 "four" 时,这个容器将不得不通过调用 reallocate 来重新分配内存 但是,字符串对象不是在相邻的位置一个接一个(类似于内置数组的实现)。当我们使用 move 构造函数时,我们只是窃取了指向字符串中第一个字符的指针。所以这是否意味着字符串元素(字符) "one""two""three" 仍在相同的旧的,现在已满的内存段。并且新分配的内存只需要保存指向这些元素的指针和任何新的后续字符串,"four"...等。被插入我们的 foo 对象?考虑到我们的字符串(char 数组)不再位于相邻位置,这不会对效率产生影响(至少可以说)吗?

最佳答案

"one""two" 这样的文字确实存储在相邻的内存中,但字符串在创建到缓冲区时复制它们(文字是只读的)。无法保证字符串将在何处分配缓冲区;字符串甚至不自己分配缓冲区,而是使用分配器。

String 的 move 构造函数只是将缓冲区的所有权从旧字符串传递给新字符串,它不会更改缓冲区在内存中的位置,因此在您的重新分配 之后,所有缓冲区都将位于与之前相同的地址。

关于c++ - 字符串 move 构造函数如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28392435/

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