免费注册 查看新帖 |

Chinaunix

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

[C++] 编译器默认生成的构造函数,会做初始化清零吗? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-12-01 15:19 |只看该作者 |倒序浏览
如题,我有下面的小程序:

  1. #include<memory>
  2. using namespace std;
  3. struct S
  4. {
  5.     int m_i;
  6.     int m_j;
  7. };
  8. class C
  9. {
  10. public:
  11.     int m_i;
  12.     int m_j;
  13. };
  14. int main()
  15. {
  16.     S obj;
  17.     C c1;
  18.     cout << obj.m_i << obj.m_j << endl;
  19.     return 0;
  20. }
复制代码
gcc下开优化-O2或者vc -O2,都会说obj/c1这两个对象都没有初始化,编译给出警告:
warning: ‘obj.S::m_i’ is used uninitialized in this function [-Wuninitialized]

我的问题是,struct S和class C,我都没有自己定义ctor,而是依赖编译器给我生成的ctor
我期待,编译器给我生成的ctor会做初始化的工作。但是看起来,不定义自己的ctor,就会有这种警告。

1. default ctor什么都不做吗?
2. 如果obj和c1都是new出来的,那么运行时库在给obj和c1分配内存的时候,是否会执行清零操作,还是说和我的main函数一样,依靠默认的ctor不会有任何初始化?

谢谢

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
2 [报告]
发表于 2015-12-01 15:26 |只看该作者
S obj = S(); 试试

论坛徽章:
0
3 [报告]
发表于 2015-12-01 18:24 |只看该作者
回复 2# bruceteen
谢谢。
很神奇, S obj=S();就不会报警告
S obj;就会。

这是为什么呢? 都是声明了一个对象而已啊,区别在何处? 难道S obj=S();编译器会生成代码来给obj清零? 这是语言标准的一部分吗

论坛徽章:
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
4 [报告]
发表于 2015-12-02 09:24 |只看该作者
回复 3# okesut


    前段时间我刚问过这是不是标准的一部分,结论是的。你这个属于POD类型,POD类型用S()初始化会清零,标准是这么规定的。
当时我提的问题是这样的,std::map<int, int> m,第一次访问m[8],是否可保证m[8]是0,结论也是有标准保证的;因为有个标准规定,当8不存在的时候,会用int()插入一个新元素,而另一个标准(也就是POD初始化)规定POD类型的int()(用括号初始化)会清零。

论坛徽章:
224
2022北京冬奥会纪念版徽章
日期:2015-08-10 16:30:32操作系统版块每日发帖之星
日期:2016-02-18 06:20:00操作系统版块每日发帖之星
日期:2016-03-01 06:20:00操作系统版块每日发帖之星
日期:2016-03-02 06:20:0015-16赛季CBA联赛之上海
日期:2019-09-20 12:29:3219周年集字徽章-周
日期:2019-10-01 20:47:4815-16赛季CBA联赛之八一
日期:2020-10-23 18:30:5320周年集字徽章-20	
日期:2020-10-28 14:14:2615-16赛季CBA联赛之广夏
日期:2023-02-25 16:26:26CU十四周年纪念徽章
日期:2023-04-13 12:23:1015-16赛季CBA联赛之四川
日期:2023-07-25 16:53:45操作系统版块每日发帖之星
日期:2016-05-10 19:22:58
5 [报告]
发表于 2015-12-02 10:42 |只看该作者
最好自己清零,就是自己初始化

不要把不确定的事交给编译器,要是某天来个大版本升级

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
6 [报告]
发表于 2015-12-02 12:11 |只看该作者
action08 发表于 2015-12-02 10:42
最好自己清零,就是自己初始化

不要把不确定的事交给编译器,要是某天来个大版本升级


这个行为是标准规定好的,不是“不确定的事”
加空的括号()叫 value-initialized(继而再引发 zero-initialized
没加的叫 default-initialized

论坛徽章:
224
2022北京冬奥会纪念版徽章
日期:2015-08-10 16:30:32操作系统版块每日发帖之星
日期:2016-02-18 06:20:00操作系统版块每日发帖之星
日期:2016-03-01 06:20:00操作系统版块每日发帖之星
日期:2016-03-02 06:20:0015-16赛季CBA联赛之上海
日期:2019-09-20 12:29:3219周年集字徽章-周
日期:2019-10-01 20:47:4815-16赛季CBA联赛之八一
日期:2020-10-23 18:30:5320周年集字徽章-20	
日期:2020-10-28 14:14:2615-16赛季CBA联赛之广夏
日期:2023-02-25 16:26:26CU十四周年纪念徽章
日期:2023-04-13 12:23:1015-16赛季CBA联赛之四川
日期:2023-07-25 16:53:45操作系统版块每日发帖之星
日期:2016-05-10 19:22:58
7 [报告]
发表于 2015-12-02 12:24 |只看该作者
加空的括号()叫 value-initialized(继而再引发 zero-initialized)

——建议代码都这样写,或者显示赋值

论坛徽章:
6
数据库技术版块每日发帖之星
日期:2015-11-27 06:20:00程序设计版块每日发帖之星
日期:2015-12-01 06:20:00每日论坛发贴之星
日期:2015-12-01 06:20:0015-16赛季CBA联赛之佛山
日期:2017-03-26 23:38:0315-16赛季CBA联赛之江苏
日期:2017-07-17 10:08:4415-16赛季CBA联赛之北京
日期:2018-03-04 17:01:50
8 [报告]
发表于 2015-12-03 13:20 |只看该作者
bruceteen 发表于 2015-12-02 12:11
这个行为是标准规定好的,不是“不确定的事”
加空的括号()叫 value-initialized(继而再引发 zero-in ...


非常感谢这么深刻的剖析!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP