C++动态内存管理 之一
- std::uninitialized_copy
- std::uninitialized_move
- std::uninitialized_default_construct
std::uninitialized_copy
template< class InputIt, class NoThrowForwardIt > NoThrowForwardIt
uninitialized_copy( InputIt first, InputIt last, NoThrowForwardIt d_first );
template< class ExecutionPolicy, class ForwardIt, class NoThrowForwardIt > NoThrowForwardIt
uninitialized_copy( ExecutionPolicy&& policy, ForwardIt first, ForwardIt last, NoThrowForwardIt d_first );
参数 | 意义 |
---|---|
first,last | 要复制的元素的范围 |
d_first | 目标范围的开头 |
policy | 要使用的执行策略。 |
该将 [first, last) 范围内的元素复制到从 d_first 开始的未初始化内存区域。如果包括policy参数,则按照policy执行。
下面代码将存储器的内容复制到另一个存储器区。
#include <iostream>
#include <memory>
#include <execution>using namespace std;int main()
{const char *v[] = {"This", "is", "a", "memory", "copy", "example"};auto sz = size(v);void *pbuf = aligned_alloc(alignof(string), sizeof(string) * sz);auto first = static_cast<string *>(pbuf);auto end = uninitialized_copy(std::begin(v), std::end(v), first);for (auto it = first; it < end; it++)cout << *it << "-";cout << endl;end = uninitialized_copy(execution::seq, std::begin(v), std::end(v), first);for (auto it = first; it < end; it++)cout << *it << "-";cout << endl;
}
上述代码运行屏幕输出
This-is-a-memory-copy-example-
This-is-a-memory-copy-example-
std::uninitialized_move
template< class InputIt, class NoThrowForwardIt > NoThrowForwardIt
uninitialized_move( InputIt first, InputIt last, NoThrowForwardIt d_first);
template< class ExecutionPolicy, class ForwardIt, class NoThrowForwardIt > NoThrowForwardIt
uninitialized_move( ExecutionPolicy&& policy, ForwardIt first, ForwardIt last, NoThrowForwardIt d_first );
参数 | 意义 |
---|---|
first,last | 要移动的元素的范围 |
d_first | 目标范围的开头 |
policy | 要使用的执行策略。 |
将元素从 [first, last) 范围移动到从 d_first 开始的未初始化内存区域。如果包括policy参数,则按照policy执行。
下面代码将数据移动到未初始化的存储器区域。
#include <iostream>
#include <memory>
#include <execution>
#include <string>
#include <iomanip>using namespace std;int main()
{string v[] = {"This", "is", "a", "memory", "copy", "example"};auto sz = size(v);void* out = std::aligned_alloc(alignof(std::string), sizeof(std::string) * sz);auto first = static_cast<string *>(out);auto last = uninitialized_move(std::begin(v), std::end(v), first);for (auto it = std::begin(v); it < std::end(v); it++)cout << std::quoted(*it) << ", ";cout << endl;for (auto it = first; it < last; it++)cout << std::quoted(*it) << ", ";cout << endl;std::destroy(first, last);std::free(out);
}
上述代码运行屏幕输出
"", "", "", "", "", "",
"This", "is", "a", "memory", "copy", "example",
std::uninitialized_default_construct
template< class ForwardIt > void uninitialized_default_construct( ForwardIt first, ForwardIt last );
template< class ExecutionPolicy, class ForwardIt > void uninitialized_default_construct( ExecutionPolicy&& policy,
ForwardIt first, ForwardIt last );
参数 | 意义 |
---|---|
first,last | 要初始化的元素的范围 |
policy | 要使用的执行策略。 |
在默认初始化范围 [first, last) ,指定的未初始化存储中构造 typename std::iterator_traits::value_type 类型的对象。如果包括参数policy,则根据policy执行。
下面代码将初始化存储器区域到约定值。
#include <iostream>
#include <memory>using namespace std;struct student {student() : name(""), age(0), score(3.10){}string name;int age;float score;
};int main()
{constexpr int n{3};alignas(alignof(student)) unsigned char mem[n * sizeof(student)];auto first {reinterpret_cast<student *>(mem)};auto last {first + n};uninitialized_default_construct(first, last);for (auto it = first; it != last; it++)cout << "name: " << it->name << " Age: " << it->age << " score: " << it->score << endl;
}
上述代码运行屏幕输出
name: Age: 0 score: 3.1
name: Age: 0 score: 3.1
name: Age: 0 score: 3.1