免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1803 | 回复: 4

[C++] 关于C++的POD类型,求确认 [复制链接]

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
发表于 2015-09-18 15:39 |显示全部楼层
  1. std::map<int, int> n;
  2. n[4] += 6;
复制代码
当n[4]最初不存在的时候,n[4] += 6以后是否一定是6,也就是说n[4]自动插入的时候,是否一定是0。
查看map的源码,当n[4]不存在的时候会执行insert(_Where, value_type(_Keyval, mapped_type())),而此时mapped_type相当于int。
也就是说int i = int(),是否有C++标准保证i一定是0。
我查了下,与此相关的资料,发现这种情况属于POD(plain old data),但是没有找到具体解释POD类型性质的资料。就测试而言,我在VS和GCC上都测试过int i = int()这种写法,发现i确实被置0了(观察汇编代码确实有置0的动作,而非巧合),但是找不到确切说明这个情况的C++标准文字内容。
另外即使int i = int()有标准保证其一定是0,那么是否标准保证n[4]在4不存在时也一定是0呢?因为有可能其相关代码是这样的:
  1. mapped_type xxx;
  2. insert(_Where, value_type(_Keyval,  xxx))
复制代码
这样就一定不能保证n[4]一定是0了。
请求确认相关标准文档,非常感谢!!!

论坛徽章:
43
15-16赛季CBA联赛之四川
日期:2018-10-13 23:26:5015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:36程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
发表于 2015-09-18 21:03 |显示全部楼层
23.4.4.3 Map Element Access

T& operator[](const key_type& x);

Effects: If there is no key equivalent to x in the map, inserts value_type(x, T()) into the map.

Requires: key_type shall be CopyConstructible and mapped_type shall be DefaultConstructible.

Returns: A reference to the mapped_type corresponding to x in *this.

Complexity: logarithmic.

T& operator[](key_type&& x);

Effects: If there is no key equivalent to x in the map, inserts value_type(std::move(x), T()) into the map.

Requires: mapped_type shall be DefaultConstructible.

Returns: A reference to the mapped_type corresponding to x in *this.

Complexity: logarithmic.


如果key不存在,map使用default constructor构造value,也就是int(),所以返回值是0。
当然,你正在用的编译器不一定遵守这个标准。

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
发表于 2015-09-19 12:23 |显示全部楼层
本帖最后由 w_anthony 于 2015-09-19 12:26 编辑

回复 2# windoze


    谢谢LS解答了,map:: operator[]插入时有标准要求一定会调用mapped_type();不过int i = int()是否一定是0,有没有标准保证呢?

论坛徽章:
43
15-16赛季CBA联赛之四川
日期:2018-10-13 23:26:5015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:36程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
发表于 2015-09-19 22:29 |显示全部楼层
回复 3# w_anthony

标准说:
8.5/5
To default-initialize an object of type T means:

— if T is a non-POD class type (clause 9), the default constructor for T is called (and the initialization is ill-formed if T has no accessible default constructor);

— if T is an array type, each element is default-initialized;

— otherwise, the object is zero-initialized.

所以int a=int()之后,a就等于0,但还是那句话,你正在用的编译器不一定完全符合标准。

PS. 注意你不能写int a(),因为这是一个函数声明,不是变量定义。

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
发表于 2015-09-20 01:06 |显示全部楼层
回复 4# windoze


    非常感谢LS,只要不是古董级的编译器,一般C++标准都可以认为是支持的。它自身再怎么扩展也不应该和标准有冲突,既然有相关规定,而不是未定义行为,那么我觉得还是可以放心使用的,最多可以结合实际测试结果看看。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

DTCC2020中国数据库技术大会

【架构革新 高效可控】2020年12月21日-23日第十一届中国数据库技术大会将在北京隆重召开。

大会设置2大主会场,20+技术专场,将邀请超百位行业专家,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨,为广大数据领域从业人士提供一场年度盛会和交流平台。

http://dtcc.it168.com


大会官网>>
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP