我想vector<char>用作缓冲区.该接口非常适合我的需求,但由于内存已初始化,因此在将其大小调整到超出当前大小时会有性能损失.我不需要初始化,因为在任何情况下,某些第三方C函数都会覆盖数据.有没有办法或特定的分配器来避免初始化步骤?请注意,我想使用resize(),没有其他的技巧,比如reserve()和capacity(),因为我需要size()总是代表我的"缓冲"在任何时刻的有意义的大小,同时capacity()可能会比以后它的尺寸更大resize(),所以,再一次,我可以不依赖capacity()作为我的申请的重要信息.此外,矢量的(新)大小事先不知道,所以我不能使用std::array.如果vector不能以这种方式配置,我想知道我可以使用哪种容器或分配器而不是vector<char, std::alloc>.唯一的要求是vector的替代方案最多必须基于STL或Boost.我可以访问C++ 11.
Max*_*kin 26
已知的问题是,即使显式也无法关闭初始化std::vector.
人们通常会实现自己的pod_vector<>,不会对元素进行任何初始化.
另一种方法是创建一个与char布局兼容的类型,其构造函数不执行任何操作:
struct NoInitChar
{
char value;
NoInitChar() noexcept {
// do nothing
static_assert(sizeof *this == sizeof value, "invalid size");
static_assert(__alignof *this == __alignof value, "invalid alignment");
}
};
int main() {
std::vector<NoInitChar> v;
v.resize(10); // calls NoInitChar() which does not initialize
// Look ma, no reinterpret_cast<>!
char* beg = &v.front().value;
char* end = beg + v.size();
}
Run Code Online (Sandbox Code Playgroud)
Joe*_*oeG 19
标准库中没有任何内容符合您的要求,也没有任何我知道的提升.
我能想到三个合理的选择:
std::vector现在坚持,在代码中留下评论并回到它,如果这会导致您的应用程序的瓶颈.construct/ destroy方法的自定义分配器- 并希望您的优化器足够聪明,可以删除对它们的任何调用.作为适用于不同 pod 类型向量的替代解决方案:
template<typename V>
void resize(V& v, size_t newSize)
{
struct vt { typename V::value_type v; vt() {}};
static_assert(sizeof(vt[10]) == sizeof(typename V::value_type[10]), "alignment error");
typedef std::vector<vt, typename std::allocator_traits<typename V::allocator_type>::template rebind_alloc<vt>> V2;
reinterpret_cast<V2&>(v).resize(newSize);
}
Run Code Online (Sandbox Code Playgroud)
然后你可以:
std::vector<char> v;
resize(v, 1000); // instead of v.resize(1000);
Run Code Online (Sandbox Code Playgroud)
这很可能是UB,尽管在我更关心性能的情况下它对我来说工作正常。由 clang 生成的生成程序集的差异:
test():
push rbx
mov edi, 1000
call operator new(unsigned long)
mov rbx, rax
mov edx, 1000
mov rdi, rax
xor esi, esi
call memset
mov rdi, rbx
pop rbx
jmp operator delete(void*)
test_noinit():
push rax
mov edi, 1000
call operator new(unsigned long)
mov rdi, rax
pop rax
jmp operator delete(void*)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4858 次 |
| 最近记录: |