免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7197 | 回复: 10
打印 上一主题 下一主题

stl实现比较 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-06-23 11:31 |只看该作者 |倒序浏览
早上无聊,用CDT玩一下调试,代码如下
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;

  4. int main() {
  5.         vector<int> vint;
  6.         vint.push_back(1);
  7.         cout << vint[0] << endl;
  8.         cout << vint[1] << endl;
  9.         return 0;
  10. }
复制代码
不出错的...,一看实现和ms的stl不一样

linux stl
  1. reference operator[](size_type __n)
  2. { return *(this->_M_impl._M_start + __n); }
复制代码
ms stl
  1. reference operator[](size_type _Pos)
  2. { // subscript mutable sequence
  3. #if _ITERATOR_DEBUG_LEVEL == 2
  4. if (size() <= _Pos)
  5. { // report error
  6. _DEBUG_ERROR("vector subscript out of range");
  7. _SCL_SECURE_OUT_OF_RANGE;
  8. }

  9. #elif _ITERATOR_DEBUG_LEVEL == 1
  10. _SCL_SECURE_VALIDATE_RANGE(_Pos < size());
  11. #endif /* _ITERATOR_DEBUG_LEVEL */

  12. return (*(this->_Myfirst + _Pos));
  13. }
复制代码
还有随便问一下,CDT怎么显示map的元素
map<int, int> mint;
mint[0] = 1;

在调试查看窗口中,无法显示mint[0]的值

论坛徽章:
0
2 [报告]
发表于 2010-06-23 11:32 |只看该作者
输出是
1
0

论坛徽章:
0
3 [报告]
发表于 2010-06-23 11:55 |只看该作者
容器查看明白了

论坛徽章:
0
4 [报告]
发表于 2011-08-29 22:19 |只看该作者
1. 能打印出两个元素的原因:
stl中的vector默认使用的标准的allocator。
sgi stl的allocator会为分配的内存8字节对齐,楼主的stl不知道是什么版本,但是既然没有coredump,应该就是内存对齐的问题。

2. 楼主列出的所谓“linux stl”的operator []的代码符合标准。即,vector的[]操作符为了性能要求,不做range check,若需要此功能,请使用at(),这些内容在标准中有具体描述。

论坛徽章:
154
2022北京冬奥会纪念版徽章
日期:2015-08-07 17:10:5720周年集字徽章-年
日期:2022-10-26 16:44:2015-16赛季CBA联赛之深圳
日期:2022-11-02 14:02:4515-16赛季CBA联赛之八一
日期:2022-11-28 12:07:4820周年集字徽章-20	
日期:2023-07-19 08:49:4515-16赛季CBA联赛之八一
日期:2023-11-04 19:23:5115-16赛季CBA联赛之广夏
日期:2023-12-13 18:09:34
5 [报告]
发表于 2011-08-29 22:28 |只看该作者
别看linux stl代码简单,你最好翻翻+是怎么重载定义context的

论坛徽章:
154
2022北京冬奥会纪念版徽章
日期:2015-08-07 17:10:5720周年集字徽章-年
日期:2022-10-26 16:44:2015-16赛季CBA联赛之深圳
日期:2022-11-02 14:02:4515-16赛季CBA联赛之八一
日期:2022-11-28 12:07:4820周年集字徽章-20	
日期:2023-07-19 08:49:4515-16赛季CBA联赛之八一
日期:2023-11-04 19:23:5115-16赛季CBA联赛之广夏
日期:2023-12-13 18:09:34
6 [报告]
发表于 2011-08-29 22:30 |只看该作者
别看linux stl代码简单,


请翻翻+是怎么重载定义context的,再做评论

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
7 [报告]
发表于 2011-09-04 11:04 |只看该作者
1. 能打印出两个元素的原因:
stl中的vector默认使用的标准的allocator。
sgi stl的allocator会为分配的内 ...
Heartwork 发表于 2011-08-29 22:19



    malloc以“节”为单位,1节=16字节。
你要了4个字节,实际给到16字节。所以用到8字节不出错。

论坛徽章:
1
射手座
日期:2013-08-21 13:11:46
8 [报告]
发表于 2011-09-05 12:11 |只看该作者
gdb调试看map内容的时候,需要知道实现,才能看里面的内容...要不然去网上下别人已经写好的脚本也可以

论坛徽章:
0
9 [报告]
发表于 2011-09-29 11:09 |只看该作者
回复 7# yulihua49


    这位仁兄的意思是最终调用malloc的时候malloc会以16字节为单位进行内存分配么?

论坛徽章:
0
10 [报告]
发表于 2011-09-29 11:14 |只看该作者
回复 7# yulihua49


    在我的机器上试了一下,确实如此,哈哈,领教!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP