C++ STL 向量保留

2023-12-25

我已经用下面的代码对 stl 矢量进行了测试:

struct structA{
   char charArray[256];
}

structA a;
..assign 256 characters to a.charArray

vector<structA> v1;
v1.reserve(1000);

for(int i=0; i<1000; i++){
   v1.push_back(a);
}

我意识到每 16 个 push_back,v1.push_back 就会出现一个峰值。我怀疑内存被重新分配。我想知道为什么会这样,因为我已经使用了储备?我尝试使用 vectorv1(1000) 声明向量,它也给出了相同的行为。

顺便说一句,如果我将字符增加到 512,则只需要 8 个 Push_back,8 * 512 提供大约 4k 内存。该问题与内存分页有关吗?

Thanks.


运行这个简单的测试,看看是否有任何您不想要或不期望的分配或释放。

#include <iostream>
#include <vector>
#include <string>
#include <stdio.h>
#include <algorithm>

template <class T> class my_allocator;

// specialize for void:
template <> class my_allocator<void> {
public:
    typedef void*       pointer;
    typedef const void* const_pointer;
    // reference to void members are impossible.
    typedef void value_type;
    template <class U> struct rebind { typedef my_allocator<U>    other; };
};

template <typename T> class my_allocator : public std::allocator<T> {
public:
    typedef size_t    size_type;
    typedef ptrdiff_t difference_type;
    typedef T*        pointer;
    typedef const T*  const_pointer;
    typedef T&        reference;
    typedef const T&  const_reference;
    typedef T         value_type;

    template <class U> 
    struct rebind { 
        typedef my_allocator<U> other; 
    };

    my_allocator() throw() 
    {
    }

    my_allocator(const my_allocator& to_copy) throw() 
    { 
    }

    template <class U> 
    my_allocator(const my_allocator<U>& to_copy) throw()
    {
    }

    ~my_allocator() throw()
    {
    }

    pointer address(reference x) const
    {
        return std::allocator<T>::address(x);
    }

    const_pointer address(const_reference x) const
    {
        return std::allocator<T>::address(x);
    }

    pointer allocate(size_type s1, typename std::allocator<void>::const_pointer hint = 0)
    {
        size_t block_size = s1 * sizeof (T);
        std::cout << "allocated, bytes: " <<  block_size << "\n";
        return std::allocator<T>::allocate(s1, hint);
    }

    void deallocate(pointer p, size_type n)
    {
        size_t block_size = n * sizeof (T);
        std::cout << "deallocated, bytes: " <<  block_size << "\n";
        std::allocator<T>::deallocate(p, n);
    }

    size_type max_size() const throw()
    {
        return std::allocator<T>::max_size();
    }

    void construct(pointer p, const T& val)
    {
        std::allocator<T>::construct(p, val);
    }

    void destroy(pointer p)
    {
        std::allocator<T>::destroy (p);
    }
};


struct structA{
    char charArray[256];
};

int main()
{
    structA a;

    std::cout << "Test 1, with reserve\n";
    {
        std::vector<structA, my_allocator<structA> > v1;
        v1.reserve(1000);
        for(int i=0; i<1000; i++){
            v1.push_back(a);
        }
    }
    std::cout << "Test 1, done\n";

    std::cout << "Test 2, without reserve\n";
    {
        std::vector<structA, my_allocator<structA> > v1;
        for(int i=0; i<1000; i++){
            v1.push_back(a);
        }
    }
    std::cout << "Test 2, done\n";

    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ STL 向量保留 的相关文章

随机推荐

  • CSS:Em 舍入误差

    最近 我重写了我正在制作的网站的 CSS 文件 并尝试使用 em 而不是 px 使大多数元素和字体的大小动态化 尺寸可以工作 有点 但至少有一个问题 当使用 em 单位作为盒子的边距 边距 0 25em 时 在 Firefox 中 我在顶部
  • 从 iPhone 模拟器获取图像

    我刚刚创建了一个图像并将其保存在 iPhone 模拟器手机库中 我想查看此图像 不是来自照片库 以从文档资源查看其属性 但我无法访问照片库的内容 Thanks Pankaj 对于 Xcode 6 模拟器图像文件现在位于 Library De
  • 是否可以从 Java 代码调用 Ant 或 NSIS 脚本?

    是否可以在运行时从 Java 代码以编程方式调用 Ant 或 NSIS 脚本 如果是这样 怎么办 You can从 Java 代码调用 ant 脚本 See 本文 http ant apache org manual running htm
  • 如何在调试字符串的函数中获取函数名称?

    我想在每次调用时输出函数名称 我可以轻松复制并粘贴函数名称 但是我想知道是否有快捷方式可以为我完成这项工作 目前我正在做 SlideInfoHeader lynxThreeFile readSlideInfoHeader QDataStre
  • 从用户电子邮件创建哈希/令牌以进行电子邮件验证

    任何人都可以帮我解答如何从用户输入 电子邮件地址 创建安全令牌 或哈希 的问题 我想制作一个用于注册的电子邮件验证系统 用户使用电子邮件地址和密码注册 我想创建一个唯一的 URL 并将其发送给用户 因此出现了问题 我将这些 安全地 存储在临
  • Android通知空指针异常

    我在活动中设置了通知 它按预期创建通知 当我返回主屏幕时 通知仍然在那里 很好 如果我单击通知 它会将我带回到创建它的活动 这太棒了 如果我单击按钮取消通知 则会收到 NullPointerException 这是电话 if notific
  • 简单的 DocumentDb 存储过程

    我正在尝试创建一个简单的 DocumentDb 存储过程以更好地理解其概念 在此示例中 我尝试返回所有 女性 用户 我是否需要关心返回单个匹配文档或多个文档 我的用户对象如下所示 id e85ee3d7 44a5 4250 a116 686
  • 如何仅在大括号之外搜索正则表达式

    我有这个正则表达式变量 var regexp new RegExp RegExp quote myExpression b g 它搜索后面有空格的表达式 RegExp quate 我从中得到如何在javascript中转义正则表达式 htt
  • 为什么使用 jQuery 返回 false 会停止传播,而使用 POJS 则不会?

    这是一个使用 POJS 的 jsfiddle 显示了return false 不会停止事件的传播 http jsfiddle net Ralt Lz2Pw http jsfiddle net Ralt Lz2Pw 这是另一个使用 jQuer
  • Rails PaperClip Attachments,知道是否有图像缩略图?

    我正在使用 Rails 3 回形针 并允许用户将附件上传到附件模型 如果文件是图像 应用程序会生成图像预览 如果文件不是 则仅上传文件 无图像预览 现在我想显示数据库中所有附件的列表 所以我使用attachment attachment l
  • ASP.NET MVC 中的 WebApi [FromUri] 等效项是什么?

    在 WebApi 中 我可以用以下方法装饰控制器操作上的参数 FromUri 如果愿意的话 将 URI 的组件 反序列化 到 POCO 模型中 又名模型绑定 尽管从 2 0 开始就使用 MVC 但我从未将它用于网站 我不知道为什么 在 AS
  • 如何根据 C# 和 .NET 中的周数获取月份

    我怎样才能得到month根据指定的周数 例如 如果获取周数2返回月份1 January 将周数乘以 7 例如 如果周数为 12 则将 12 乘以 7 这将表示已经过去的天数 四舍五入到最接近的周 将该数字除以 30 在示例中 我们计算得出的
  • 使用 mongoose 完成两个异步查询后进行回调

    使用猫鼬 我希望在两个不同的查询完成后进行回调 var team Team find name myteam var games Game find visitor myteam 那么假设我希望这些请求非阻塞并异步执行 如何在 Promis
  • 如何根据控制台输出中的文本使 GitLab 的 CI/CD 作业失败?

    我在用Lerna https github com lerna lerna管理多包存储库 在我的部署工作中 我使用 Lernapublish命令 对我来说 如果包中的代码发生更改 它应该始终向我们的 Artifactory 发布新版本 如果
  • Rails/ActiveRecord - 如何使其更简洁?

    在我看来 我有如下一行 看来我必须经常做这种事情 因为有些字段可以为空 有更好的方法来写这个吗 我可以在模型层处理它 但据我所知 这并不是真正的模型层功能 您可以使用delegate http api rubyonrails org cla
  • Android 的代码覆盖率 (calabash-android BDD)

    我正在使用测试我的 Android 应用程序葫芦安卓 https github com calabash calabash android它提供了它自己的 测试项目 以及一个重命名其包以反映测试下的应用程序的脚本 然后使用 Instrume
  • 您希望 Ruby 语言有哪些改进?

    您希望 Ruby 以及更广泛的 Ruby 社区 改进哪些方面 I read 某处 http blog hasmanythrough com 2008 6 20 recursive lambdaRuby 是 Smalltalk 和 LISP
  • 如何在不使用任何 html 标签的情况下向 html 文本添加换行符

    我想在网站上的个人资料文本中插入换行符 该网站只允许插入文本 因此我不能使用任何 html 标签 我想知道是否有任何方法可以像使用 ASCII 代码插入空格或制表符一样插入换行符 您可以设置white space to pre line 这
  • 在 Angular 2 材质的 md-grid-list 中使用 md-cards

    我是 Angular 2 材料设计的新手 我想要实现的是使用 angular2 材质创建一个网格列表并将 md cards 放入 md grid tile 中 虽然 md card 有position relative 但它们溢出了 md
  • C++ STL 向量保留

    我已经用下面的代码对 stl 矢量进行了测试 struct structA char charArray 256 structA a assign 256 characters to a charArray vector