use*_*089 4 c++ heap-memory unique-ptr c++11
假设我有一个我要排序的动态数组,我可以做
std::vector<int> v(100);
for (int i = 0; i < 100; i++) v[i] = rand();
std::sort(v.begin(), v.end());
Run Code Online (Sandbox Code Playgroud)
但对于性能关键代码,初始化开销是不可接受的,更多细节请访问/sf/answers/508836191/
我也可以
int *v = new int[100];
for (int i = 0; i < 100; i++) v[i] = rand();
std::sort(v, v + 100);
Run Code Online (Sandbox Code Playgroud)
但是必须自己管理内存必然会在大型代码库中发生内存泄漏.
所以似乎最可行的方法是
std::unique_ptr<int[]> v(new int[100]);
for (int i = 0; i < 100; i++) v[i] = rand();
std::sort(v, v + 100);
Run Code Online (Sandbox Code Playgroud)
没有初始化开销也不需要担心内存管理,但这会返回一个很长的编译错误.有人能让我知道我做错了什么吗?
我在Ubuntu 14.04,GCC作为编译器.
编辑:更改代码,以便数据尚未排序
Bar*_*rry 11
std::sort仍然需要迭代器,而unique_ptr不是迭代器.但是,它确实保留了可以用作一个的东西:它的指针:
std::sort(v.get(), v.get() + 100);
Run Code Online (Sandbox Code Playgroud)
要么
std::sort(&*v, &*v + 100);
Run Code Online (Sandbox Code Playgroud)
要么
std::sort(&v[0], &v[0] + 100); // N.B. &v[100] invokes undefined behavior
Run Code Online (Sandbox Code Playgroud)
但你真正想要的是一个vector默认初始化而不是初始值的分配器.这就是性能差异的来源 - 使用std::vector默认分配器将int首先对所有s进行零初始化,然后为它们分配一些值,而其他选项则没有这个额外的零初始化步骤.
查看Casey实现这样的事情,然后做:
std::vector<int, default_init_allocator<int>> v(100); // not zero-initialized
for (int i = 0; i < 100; i++) v[i] = i;
std::sort(v.begin(), v.end());
Run Code Online (Sandbox Code Playgroud)
在不必处理分配器的意义上更简单的另一种方法(虽然在代码方面更烦人)是引入一个包装器,int为其初始化值不做任何事情:
template <class T>
struct Wrapper {
Wrapper() { }
T value;
};
std::vector<Wrapper<int>> v(100); // not zero-initialized
for (int i = 0; i < 100; i++) v[i].value = i; // but have to do this...
Run Code Online (Sandbox Code Playgroud)
请注意,仅仅使用reserve()并且push_back()不够 - 这仍然需要做的工作比在默认初始化之后通过索引分配更多,并且如果您对延迟敏感到足以提出这个问题,那么这可能很重要.
| 归档时间: |
|
| 查看次数: |
305 次 |
| 最近记录: |