<bdo id='rz5C6'></bdo><ul id='rz5C6'></ul>

      <legend id='rz5C6'><style id='rz5C6'><dir id='rz5C6'><q id='rz5C6'></q></dir></style></legend>
      <i id='rz5C6'><tr id='rz5C6'><dt id='rz5C6'><q id='rz5C6'><span id='rz5C6'><b id='rz5C6'><form id='rz5C6'><ins id='rz5C6'></ins><ul id='rz5C6'></ul><sub id='rz5C6'></sub></form><legend id='rz5C6'></legend><bdo id='rz5C6'><pre id='rz5C6'><center id='rz5C6'></center></pre></bdo></b><th id='rz5C6'></th></span></q></dt></tr></i><div id='rz5C6'><tfoot id='rz5C6'></tfoot><dl id='rz5C6'><fieldset id='rz5C6'></fieldset></dl></div>
    1. <tfoot id='rz5C6'></tfoot>
    2. <small id='rz5C6'></small><noframes id='rz5C6'>

      增加容量时 std::vector *必须* 移动对象吗?或者,分

      时间:2023-09-16

      <legend id='s8ZDJ'><style id='s8ZDJ'><dir id='s8ZDJ'><q id='s8ZDJ'></q></dir></style></legend>
    3. <tfoot id='s8ZDJ'></tfoot>

      <small id='s8ZDJ'></small><noframes id='s8ZDJ'>

      <i id='s8ZDJ'><tr id='s8ZDJ'><dt id='s8ZDJ'><q id='s8ZDJ'><span id='s8ZDJ'><b id='s8ZDJ'><form id='s8ZDJ'><ins id='s8ZDJ'></ins><ul id='s8ZDJ'></ul><sub id='s8ZDJ'></sub></form><legend id='s8ZDJ'></legend><bdo id='s8ZDJ'><pre id='s8ZDJ'><center id='s8ZDJ'></center></pre></bdo></b><th id='s8ZDJ'></th></span></q></dt></tr></i><div id='s8ZDJ'><tfoot id='s8ZDJ'></tfoot><dl id='s8ZDJ'><fieldset id='s8ZDJ'></fieldset></dl></div>

            <tbody id='s8ZDJ'></tbody>
            <bdo id='s8ZDJ'></bdo><ul id='s8ZDJ'></ul>
                本文介绍了增加容量时 std::vector *必须* 移动对象吗?或者,分配器可以“重新分配"吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

                问题描述

                A 不同的问题激发了以下想法:

                std::vector 是否必须在增加容量时移动所有元素?

                据我所知,标准行为是底层分配器请求整个新大小的块,然后移动所有旧元素,然后销毁旧元素,然后释放旧内存.

                鉴于标准分配器接口,这种行为似乎是唯一可能的正确解决方案.但我想知道,修改分配器以提供一个 reallocate(std::size_t) 函数是否有意义,该函数将返回一个 pair 并且可以映射到底层realloc()?这样做的好处是,如果操作系统实际上可以扩展分配的内存,则根本不需要移动.布尔值将指示内存是否已移动.

                (std::realloc() 可能不是最好的选择,因为如果我们不能扩展,我们不需要复制数据.所以实际上我们更想要像 extend_or_malloc_new().也许基于 is_pod-trait 的特化将允许我们使用实际的 realloc,包括它的按位复制.只是不一般.)

                这似乎是一个错失的机会.最坏的情况,你总是可以将 reallocate(size_t n) 实现为 return make_pair(allocate(n), true);,所以不会有任何惩罚.>

                是否有任何问题使此功能不适用于 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 < new_size; ++i){alloc.construct(p + i, T());}alloc.deallocate(buf);buf = p;

                新实现:

                pairpp = alloc.reallocate(buf, new_size);if (pp.second) {/* 和以前一样 *

                    <small id='mHcLY'></small><noframes id='mHcLY'>

                      <tfoot id='mHcLY'></tfoot>
                    1. <i id='mHcLY'><tr id='mHcLY'><dt id='mHcLY'><q id='mHcLY'><span id='mHcLY'><b id='mHcLY'><form id='mHcLY'><ins id='mHcLY'></ins><ul id='mHcLY'></ul><sub id='mHcLY'></sub></form><legend id='mHcLY'></legend><bdo id='mHcLY'><pre id='mHcLY'><center id='mHcLY'></center></pre></bdo></b><th id='mHcLY'></th></span></q></dt></tr></i><div id='mHcLY'><tfoot id='mHcLY'></tfoot><dl id='mHcLY'><fieldset id='mHcLY'></fieldset></dl></div>
                        <tbody id='mHcLY'></tbody>
                        <bdo id='mHcLY'></bdo><ul id='mHcLY'></ul>
                        <legend id='mHcLY'><style id='mHcLY'><dir id='mHcLY'><q id='mHcLY'></q></dir></style></legend>