使用的内存:std::list 与std::forward_list

2024-03-21

因为list比forward_list多了一个指针(前一个指针),所以如果它们都保存相同数量的元素,即1

然后,如果我重复调用 resize 越来越大,forward_list 必须能够调整得比 list 大得多。

测试代码:

#include<forward_list>
#include<list>
#include<iostream>
int main(){
    using namespace std;
    typedef list<char> list_t;
    //typedef forward_list<char> list_t;
    list_t l;
    list_t::size_type i = 0;
    try{
        while(1){
            l.resize(i += (1<<20));
            cerr<<i<<" ";
        }
    }
    catch(...){
        cerr<<endl;
    }
    return 0;
}

令我惊讶的是,当进程被杀死时,它们的大小几乎相同...... 有谁能解释一下吗?


我知道这个问题已有 4 年历史了,但公认的答案毫无意义(正如贾斯汀·雷蒙德指出的那样)。

Nick Babcock 的方法并不精确,因为元素数量太少;堆上总是有一些开销,您也将对其进行测量。

为了展示这一点,我使用了更大的数据类型和更多元素(4096): 在g++ 6.2.1 and linux x64 sizeof(void*) = 8 and sizeof (bigDataType_t) = 800 (bigData_t is long[100]).

那么我们期待什么呢?每种类型的列表都必须在堆上存储实际数据;std::list每个链接存储 2 个指针(向后和向前),std::forward_list只有一个(前进)。

预期内存std::list: 4096 x 800 + 2 x 8 x 4096 = 3,342,336 bytes

实际内存为std::list: 3,415,040 bytes

预期内存std::forward_list: 4096 x 800 + 1 x 8 x 4096 = 3,309,568 bytes

实际内存为std::forward_list: 3,382,272 bytes

I used Massif http://valgrind.org/docs/manual/ms-manual.html获取程序的堆使用情况。

正如我们所看到的,这些数字非常吻合。当使用大数据类型时,额外指针的内存没有太大区别!

使用时char作为数据类型(作为OP),预期的内存占用和实际的内存占用不太吻合,很可能是因为一些开销。但是,内存消耗没有因素 3。

std::list: Expected 69,632 bytes, actual: 171,008 bytes

std::forward_list: Expected 36,864 bytes, actual: 138,240 bytes

My code:

#include <list>
#include <forward_list>

struct bigData_t {
    long foo[100];
};
typedef bigData_t myType_t;
// typedef char myType_t;

int main()
{
#ifdef USE_FORWARD_LIST
    std::forward_list<myType_t> linkedList;
#else
    std::list<myType_t> linkedList;
#endif
    for (int i = 0; i < 4096; i++) {
        myType_t bigData;
        linkedList.push_front(bigData);
    }
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用的内存:std::list 与std::forward_list 的相关文章

随机推荐

  • 什么是“分段错误(核心转储)”? [复制]

    这个问题在这里已经有答案了 我正在尝试在 Linux 中编写一个具有 sqrt 参数的 C 程序 代码如下 include
  • 更改 Javascript 警报的标题 [重复]

    这个问题在这里已经有答案了 如何更改 javascript 警报弹出窗口的标题 你不能 https developer mozilla org en US docs DOM window alert 这是由浏览器决定的 为了用户的安全 例如
  • 小吃店不显示

    我继承自BaseActivity对于所有其他活动 public class BaseActivity extends AppCompatActivity public static CoordinatorLayout coordinator
  • Mysql:一般错误:1366 字符串值不正确

    今天 我在开发基于 PHP MySql 和 Zend Framework 的应用程序时遇到错误 此外 我正在使用phpseclib http phpseclib sourceforge net 使用加密数据AES算法 http en wik
  • 如何获取任意矩阵的缩放值?

    图像按矩阵缩放 Matrix matrix new Matrix matrix postScale matrix postTranslate matrix postRotate 我希望缩放后的图像不会小于原始图像的一半 因此总缩放不应小于0
  • 如何使用 GCC 和 Linux 子系统为 Windows 编译可执行文件?

    Windows 10 周年更新包括适用于 Ubuntu 的 Linux 子系统 我安装了 gccsudo apt get install gcc 我写了一些简单的 C 代码用于测试目的 include
  • PHP 验证复选框

    我搜索了整个互联网 试图找到我在这里缺少的东西 或做错的事情 的解决方案 即使选中该复选框 我的表单也不会验证 其他一切都很好 这是我无法正常工作的复选框 我尝试了许多不同的想法 但即使选中 条款 它也不会验证 例如下面的示例 这是我的 H
  • 如果前一个请求正在运行,如何取消 $.ajax 请求? [复制]

    这个问题在这里已经有答案了 我有这段简单的代码 document on input addFoodSearch function event var search this val ajax url ajax search food php
  • SQL Server:UNION 后的 INNER JOIN 导致哈希匹配(聚合)缓慢

    这是一个会减慢整个存储过程速度的 CTE select from finalResults where intervalEnd is not null union select two startTime two endTime two i
  • 无法让 MailChimp 使用 API 和 Curl 保存我的数据

    我已经尝试过使用curl将数据发送到MailChimp但无法获取 要保存在 MailChimp 中的数据 任何对此的帮助将不胜感激 这是我的代码 mailChimpUrl http us2 api mailchimp com 1 3 met
  • 让 Preferences API 在 Android 和 PC 上运行

    我想从在 PC 或 Android 手机上运行的草图中保存用户首选项 并尽可能使用标准 Java 方式 中的相同代码 适合我的目的的理想候选者似乎是 java util prefs Preferences 类 因此 我编写了一个小测试脚本来
  • 使用 socket.io 和 webpack-dev-server 时出错

    快速问一下大家 我正在尝试将 webpack dev server 与 socketio 一起使用 但是在尝试了不同的操作之后 我认为两个客户端都在监听相同的端口 3000 并且最终出现了某种握手错误如果我不在同一端口上使用 webpack
  • C 性能和编译选项

    对于像选择排序这样的简单算法 我有两个类似的实现 java 和 c public interface SortingAlgorithm public void sort int a public class SelectionSort im
  • 从选项卡转到根页面

    我想知道如何返回到 rootPage 中定义的appComponent使用选项卡时 setRoot 方法没有按我的预期工作 当它在选项卡页面中使用时 导航堆栈不会被清除 在 主页 上 后退按钮可见 而不是导航切换 并且显示选项卡的标题 默认
  • ASP.NET MVC = 具有 .NET 类库的经典 ASP。真的吗?

    This https web archive org web 20130307101732 http geekswithblogs net 80 AzamSharp archive 2007 12 11 117590 aspx博客文章和我们
  • 有什么方法可以为 WebAPI 项目生成 C# HTTPClient 包装器吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 在即将推出的项目中 我们希望使用 ASP NET WebAPI 2 向我们的网站和浏览器客户端公开服务
  • Postgres SSL 错误

    我正在尝试通过 SSH 和 drush 命令行 shell 运行 Drupal 迁移 将数据从 postgres 数据库复制到 mysql 它工作正常一段时间 大约 5 分钟左右 但随后我收到错误 SQLSTATE HY000 Genera
  • MongoDB、Redis 与 Cassandra 的快速写入、临时行存储解决方案

    我正在构建一个跟踪和验证广告展示次数和点击次数的系统 这意味着有很多插入命令 平均每秒约 90 个 峰值为 250 个 和一些读取操作 但重点是性能并使其速度极快 该系统目前使用 MongoDB 但从那时起我就开始使用 Cassandra
  • 您可以使用实体框架 4.1 代码优先方法创建 sql 视图/存储过程吗

    Entity Framework 4 1 Code First 非常适合创建表和关系 是否可以使用代码优先方法创建 sql 视图或存储过程 任何有关此的指示都将受到高度赞赏 多谢 我们在实体框架代码优先迁移中支持存储过程 我们的方法是创建一
  • 使用的内存:std::list 与std::forward_list

    因为list比forward list多了一个指针 前一个指针 所以如果它们都保存相同数量的元素 即1 然后 如果我重复调用 resize 越来越大 forward list 必须能够调整得比 list 大得多 测试代码 include