Tag: 分配器

使std :: vector分配alignment的内存

是否有可能使std::vector自定义结构的std::vector分配alignment内存进一步处理与SIMD指令? 如果可以使用Allocator ,有没有人碰巧有这样一个分配器,他可以分享?

size_type是否可以大于std :: size_t?

具有std::allocator标准容器的size_type定义为std::size_t 。 然而,是否有可能有一个分配器的大小不能用size_t表示的对象? 换句话说, size_type是否可以比size_t ?

自定义C ++分配器的令人信服的例子?

有什么理由让std::allocator支持自定义解决scheme吗? 你是否遇到过正确性,性能,可扩展性等绝对必要的情况? 任何真正聪明的例子? 自定义分配器一直是标准库的一个function,我没有太多需要。 我只是想知道这里有没有人可以提供一些令人信服的例子来certificate它们的存在。

c ++ Vector,每当它在堆栈上展开/重新分配时会发生什么?

我是新来的C + +,我在我的项目上使用vector类。 我发现它非常有用,因为我可以有一个数组,在必要时自动重新分配(例如,如果我想push_back一个项目,并且vector已经达到了最大容量,它会重新分配自己,向操作系统请求更多的内存空间)访问vector的元素非常快(它不像列表,为了达到“第n个”元素,我必须通过“n”个第一个元素)。 我发现这个问题非常有用,因为他们的答案完美地解释了“内存分配器”是如何工作的,当我想把我的vector存储在堆/栈上时: [1] vector<Type> vect; [2] vector<Type> *vect = new vector<Type>; [3] vector<Type*> vect; 然而,有一个疑问是困扰我一段时间,我无法find答案:每当我构build一个向量,并开始推入大量的项目,它会达到vector将满的一刻,所以继续增长它将需要重新分配,复制自己到一个新的位置,然后继续push_back项目(显然,这个重新分配它隐藏在类的实现,所以它是完全透明的我) 好的,如果我已经在堆上创build了这个向量[2],我不会想象会发生什么事情:类向量调用malloc,获取新的空间,然后将自身复制到新的内存中,最后删除自由调用的旧内存。 然而,当我在栈上构造一个向量时,面纱隐藏了发生的事情:当向量必须重新分配时,会发生什么? AFAIK,无论何时在C / C ++中input一个新的函数,计算机都会查看variables的声明,然后展开堆栈以获得必要的空间来放置这些variables,但是在堆栈中不能分配更多的空间function已经在运行。 类vector如何解决这个问题?

std :: vector *在增长容量时有移动对象吗? 或者,分配器可以“重新分配”吗?

另外一个问题启发了以下想法: std::vector<T>在增加容量时必须移动所有元素吗? 据我所知,标准的行为是为底层的分配器请求新的大小的整个块,然后移动所有旧的元素,然后销毁旧的元素,然后释放旧的内存。 这种行为似乎是给定标准分配器接口的唯一可能的正确解决scheme。 但是我想知道,修改allocator来提供一个reallocate(std::size_t)函数会返回一个pair<pointer, bool>并且可以映射到底层的realloc()吗? 这样做的好处是,如果操作系统实际上只能扩展分配的内存,那么根本不会有任何移动。 布尔值将指示内存是否已移动。 ( std::realloc()可能不是最好的select,因为如果我们不能扩展,我们不需要复制数据,所以实际上我们想要的东西就像extend_or_malloc_new() 。 编辑:也许是一个is_pod -trait-基于规则的专业化将允许我们使用实际的realloc ,包括它的按位副本,只是不一般。) 这似乎是一个错过的机会。 最糟糕的情况是,你总是可以实现reallocate(size_t n)作为return make_pair(allocate(n), true); ,所以不会有任何处罚。 是否有任何问题,使这个function不适合或不适合的C + +? 也许唯一可以利用这个的容器是std::vector ,但是这又是一个相当有用的容器。 更新:一个小例子来澄清。 当前resize() : pointer p = alloc.allocate(new_size); for (size_t i = 0; i != old_size; ++i) { alloc.construct(p + i, T(std::move(buf[i]))) alloc.destroy(buf[i]); } for (size_t i = old_size; i < […]