免费注册 查看新帖 |

Chinaunix

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

[C++] C++空对象仍然占据一个字节,这个是标准规定的吗? [复制链接]

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 10:01:44
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-12-07 19:27 |只看该作者 |倒序浏览
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
89
水瓶座
日期:2014-04-01 08:53:31天蝎座
日期:2014-04-01 08:53:53天秤座
日期:2014-04-01 08:54:02射手座
日期:2014-04-01 08:54:15子鼠
日期:2014-04-01 08:55:35辰龙
日期:2014-04-01 08:56:36未羊
日期:2014-04-01 08:56:27戌狗
日期:2014-04-01 08:56:13亥猪
日期:2014-04-01 08:56:02亥猪
日期:2014-04-08 08:38:58程序设计版块每日发帖之星
日期:2016-01-05 06:20:00程序设计版块每日发帖之星
日期:2016-01-07 06:20:00
2 [报告]
发表于 2013-12-07 20:11 |只看该作者
我感觉标准里面不会写这个。

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
3 [报告]
发表于 2013-12-07 22:25 |只看该作者
回复 1# udodoo
标准对此的确有规定,但没有明确规定空对象一定要是1字节,标准只是规定了对象的大小必须大于0,首先标准中有如下标定“An object is a region of storage. ”,显然不存在0字节长度的存储区域,这句话隐含了空对象是大于0的,另外还有标定“a most derived object shall have a non-zero size and shall occupy one or more
bytes of storage. Base class sub-objects may have zero size. An object of POD contiguous bytes of storage.”,说明了最终派生对象大小是非0值,其大小可以是1或多个字节,基类子对象可以为0(任何可直接创建的对象都不会为0,如果一个类A是个空类,那么直接创建对象的时候大小为1,如果B类从A类派生并且没有额外的数据成员,那么直接创建B类时大小依然为1,规定对基类子对象可为0的规定使的编译器会进行空基类优化)。最后在关于sizeof操作符中也有相关规定“The size of a most derived class shall be greater than zero ”,可见规定的确规定了空对象大小不能为0的现实,但却不强制其大小一定为1(这为编译器为不同的操作系统进行优化留有余地,比如说在不同字长[8,16,32,64]位CPU下,最有效率的操作数类型都是CPU的字长,那么编译器可以选择机器字长来作为不为0时的最小长度)。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2013-12-07 22:33 |只看该作者
因为size为0时,很多地方会让程序员吐血,所以只好维和了
sizeof(a) / sizeof(a[0])

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 10:01:44
5 [报告]
发表于 2013-12-08 12:51 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 10:01:44
6 [报告]
发表于 2013-12-08 12:52 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
7 [报告]
发表于 2013-12-08 12:56 |只看该作者
3楼回答 应该算是正解了!

论坛徽章:
0
8 [报告]
发表于 2013-12-08 14:46 |只看该作者
回复 3# myworkstation


    好专业啊,赶紧去回答一下我的问题吧,

论坛徽章:
0
9 [报告]
发表于 2013-12-09 09:00 |只看该作者
空对象大小应该为0才和逻辑,怎么能大于0呢?sb的c++

论坛徽章:
0
10 [报告]
发表于 2013-12-09 09:56 |只看该作者
如果空对象的所占内存大小为0,那两个空对象取地址一样,就区分不了了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP