Dict.CN 在线词典, 英语学习, 在线翻译

学海苦作舟,书山勤为径

留下点回忆

常用链接

统计

积分与排名

Denoise

English study

Web技术

数据压缩

一些连接

最新评论

为什么C++的结构体或类没有成员是1个字节大小?

本随笔紧接上个随笔:空结构体(类对于C++)的大小
http://www.cppblog.com/windcsn/archive/2011/04/13/144162.html

这里试图讨论为什么C++的结构体或类即使没有成员也需要一个字节的大小?
首先需要一个字节的作用在上个随笔中已经说明,是为了在生成实例的时候确定区别;但实际上在C里面是不支持空成员的结构体,直接报编译错误。
因此这是C++特有的特性,可能有如下的原因:
1.C++里面必须支持没有成员的类,比如纯虚类;这些类只有方法,没有数据成员(虽然会有虚表);但这些类不会被实例化。
2.为了达到统一,非纯虚类的C++结构体和类也会被C++支持,但他们需要实例化,所以需要提供一个字节来可以给他们分配内存。

而C里面是不支持没有成员的结构体(VC里面是编译不过的),其实完全没有必要支持这种无意义的定义,从而更简单。

欢迎讨论。

posted on 2011-04-14 11:34 笨笨 阅读(3316) 评论(12)  编辑 收藏 引用 所属分类: C++

评论

# re: 为什么C++的结构体或类没有成员是1个字节大小? 2011-04-14 12:19 陈梓瀚(vczh)

带有虚函数的类会有至少一个隐藏的成员,所以这个不是问题。但是你new一个真的什么都没有的类得获得一个有效指针,因此长度不能是0。反正正常人不会真的去分配真的没有成员的类的,所以1个字节是可以接受的。

C++里面声明一个空struct都是为了获得一个强类型的指针外壳。譬如说

typedef struct __i_dont_know_what_its_name__
{
//有时候这里会有int __unused;为了让C能编译通过。
}* HWND;  回复  更多评论   

# re: 为什么C++的结构体或类没有成员是1个字节大小? 2011-04-14 12:47 windyhoo

我在G++下编译,里面一个字节的内容是0  回复  更多评论   

# re: 为什么C++的结构体或类没有成员是1个字节大小?[未登录] 2011-04-14 12:50 cc

那个字节貌似是给虚表制针留的。  回复  更多评论   

# re: 为什么C++的结构体或类没有成员是1个字节大小? 2011-04-14 13:01 EvilGhost

主要还是对象这个概念的问题。如果一个空对象不使用实际的存储空间来表示那用什么方式表示好呢?虽然是空对象,但毕竟还是个对象,总是要作为一个实体和其他实体进行区别的。如果要区别,那么必然需要某种标识,这种标识至少也是一个实体,它需要占用存储空间。其实也就没有办法避免存储空间了,那给其分配1个字节也是一种合乎情理的解决方案了。  回复  更多评论   

# re: 为什么C++的结构体或类没有成员是1个字节大小? 2011-04-14 13:15 笨笨

@windyhoo
回头试试  回复  更多评论   

# re: 为什么C++的结构体或类没有成员是1个字节大小? 2011-04-14 13:17 笨笨

@EvilGhost
如果仅仅只是对象的区别,是不是可以考虑不允许定义这种没有意义的类更为实际,就象C那样  回复  更多评论   

# re: 为什么C++的结构体或类没有成员是1个字节大小? 2011-04-14 17:50 dawnless

没有意义的类?事实上STL中的函数对象就是通过这种方式实现的@笨笨
  回复  更多评论   

# re: 为什么C++的结构体或类没有成员是1个字节大小? 2011-04-14 21:14 EvilGhost

@笨笨
空对象是很有用的,如果它是模板类对象,可以携带类信息被存储。  回复  更多评论   

# re: 为什么C++的结构体或类没有成员是1个字节大小? 2011-04-15 13:04 oah


http://www.spongeliu.com/clanguage/why-not-null/

着个文章有解释 挺好的  回复  更多评论   

# re: 为什么C++的结构体或类没有成员是1个字节大小? 2011-04-15 21:57 笨笨

@oah
那个文章只解释为什么为1,但并没有解释为什么不允许空类?  回复  更多评论   

# And I tohught I was the sensible one. Thanks for setting me straight. 2011-05-26 17:41 Kristabelle

And I tohught I was the sensible one. Thanks for setting me straight.  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理