为什么sizeof一个空的结构体,或者空的类,结果是1?

jehrdekrnkh 2012-09-16 08:03:11
不明白。
...全文
624 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
飞天御剑流 2012-09-17
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 的回复:]

为了解决一个问题,
struct A {
} a[2], *p1, *p2;


p1 = &a[0];
p2 = p1 + 1;

那么
(p1 == p2) 是成立呢还是不成立呢.
[/Quote]
在c中,无所谓成立还是不成立,因为是未定义行为;但在c++中,一定不成立,否则是非标准行为。
mymtom 2012-09-17
  • 打赏
  • 举报
回复
为了解决一个问题,
struct A {
} a[2], *p1, *p2;


p1 = &a[0];
p2 = p1 + 1;

那么
(p1 == p2) 是成立呢还是不成立呢.

飞天御剑流 2012-09-17
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 的回复:]

  一、空结构体有多大?
结构体所占内存的大小是其成员所占内存之和。但是像下面的这种情况呢?
struct student
{
}stu;
sizeof(stu)的值是多少呢?
答案是1。为什么呢?试想,如果我们把struct student看成一个模子的话,你能造出没有任何容积的模子吗?显然不行。编译器也是如此认为。编译器认为任何一种数据类型都有其大小,用它来定义一个变量能够分配确……
[/Quote]
《c语言深度剖析》这几段描述是错误的,又犯了从实现的结果去理解语言的错误。

对于c,没有成员的结构体属于未定义行为,发生什么结果都有可能,甚至编译错误等等,取决于编译器设计者的观念,而非结果为1。

但c++与c不同,基类子对象允许为0,但最终派生对象至少为1,而非一定等于1。
ryxjxyx 2012-09-17
  • 打赏
  • 举报
回复
#6#8#16都是正解!
dhdahai 2012-09-17
  • 打赏
  • 举报
回复
占位符
mymtom 2012-09-17
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 的回复:]
对于c,没有成员的结构体属于未定义行为,发生什么结果都有可能,甚至编译错误等等,取决于编译器设计者的观念,而非结果为1。
[/Quote]
没有成员的结构体属于未定义行为,发生什么结果都有可能,但是编译器不应该报错的。
无论是C89还是C99都是允许结构体没有成员的。
dargencoder 2012-09-17
  • 打赏
  • 举报
回复
学习了楼上的,路过的表示学习了~~
sinosinux 2012-09-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

struct 和 class 在空的时候会自动加一个 char 或 int 变量 进去.

原因是 如果struct 或 class 为空,指向他们的指针将无法区分一个或多个同类的struct/class.
就是说,在实例化的时候会导致指针错乱.

还是举个例子来解释吧, 如果 class 为空, 那么对于数组 a[10] 来说, a , a+1 , a+9 实际上都是指向a[0], ……
[/Quote]
正解
firendlys 2012-09-16
  • 打赏
  • 举报
回复
struct 和 class 在空的时候会自动加一个 char 或 int 变量 进去.

原因是 如果struct 或 class 为空,指向他们的指针将无法区分一个或多个同类的struct/class.
就是说,在实例化的时候会导致指针错乱.

还是举个例子来解释吧, 如果 class 为空, 那么对于数组 a[10] 来说, a , a+1 , a+9 实际上都是指向a[0], (因为 a+n 实际上是 a+sizeof(class)*n )
那么怎样区分 a[0] 和 a[9] 呢? 这就出问题了.

当然,按照ls的说法也行,标准里面明确规定了....
wssubmariner 2012-09-16
  • 打赏
  • 举报
回复
  一、空结构体有多大?
  结构体所占内存的大小是其成员所占内存之和。但是像下面的这种情况呢?
  struct student
  {
  }stu;
  sizeof(stu)的值是多少呢?
  答案是1。为什么呢?试想,如果我们把struct student看成一个模子的话,你能造出没有任何容积的模子吗?显然不行。编译器也是如此认为。编译器认为任何一种数据类型都有其大小,用它来定义一个变量能够分配确定大小的空间。既然如此,编译器就理所当然地认为任何一个结构体都是有大小的,哪怕这个结构体为空。万一结构体真的为空,那它的大小为什么值比较合适呢?
  假设结构体内只有一个char型的数据成员,那其大小为1字节(这里先不考虑内存对齐的情况),也就是说非空结构体类型数据最少需要占1字节的空间,而空结构体类型数据总不能比最小的非空结构体类型数据所占的空间大把。这就麻烦了,空结构体的大小既不能为0,也不能大于1,怎么办?定义为0.5字节?但是内存地址的最小单位是1字节,0.5字节怎么处理?解决这个问题的最好办法就是折中,编译器理所当然地认为,你构造一个结构体数据类型是用来打包一些数据成员的,而最小的数据成员需要1字节,编译器为每个结构体类型数据至少预留1字节的空间。所以,空结构体的大小就定义为1字节。-----参考自《c语言深度剖析》
ljhhh0123 2012-09-16
  • 打赏
  • 举报
回复
《深度探索C++对象模型》一书详解。
ri_aje 2012-09-16
  • 打赏
  • 举报
回复
这是标准明确要求的
1.8/5

Unless it is a bit-field (9.6), a most derived object shall have a non-zero size and shall occupy one or more bytes of storage.
healer_kx 2012-09-16
  • 打赏
  • 举报
回复
理由可以查 C++对象模型。
Ydc__ 2012-09-16
  • 打赏
  • 举报
回复
我想到的是: 指向空的指针sizeof也不为零 (情况有点不一样)..
学习了 去上课了....

回头再查查
jehrdekrnkh 2012-09-16
  • 打赏
  • 举报
回复
http://blog.csdn.net/sunboy_2050/article/details/6589999
jehrdekrnkh 2012-09-16
  • 打赏
  • 举报
回复
这个应该不关sizeof的事吧?
应该是关空struct的事吧?


[Quote=引用 1 楼 的回复:]

MSDN上关于sizeof有一句:
The sizeof operator never yields 0, even for an empty class.
[/Quote]
Eleven 2012-09-16
  • 打赏
  • 举报
回复
MSDN上关于sizeof有一句:
The sizeof operator never yields 0, even for an empty class.

herman~~ 2012-09-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

struct 和 class 在空的时候会自动加一个 char 或 int 变量 进去.

原因是 如果struct 或 class 为空,指向他们的指针将无法区分一个或多个同类的struct/class.
就是说,在实例化的时候会导致指针错乱.

还是举个例子来解释吧, 如果 class 为空, 那么对于数组 a[10] 来说, a , a+1 , a+9 实际上都是指向a[0], ……
[/Quote]
正解
  • 打赏
  • 举报
回复
带一个字节的地址信息,防止不同空类发生紊乱
mujiok2003 2012-09-16
  • 打赏
  • 举报
回复
标准规定:5.3.3 expr.sizeof
When applied to a reference or a reference type, the result is the size of the referenced type. When applied to a class,
the result is the number of bytes in an object of that class including any padding required for placing objects of that type
in an array. The size of a most derived class shall be greater than zero (1.8). The result of applying sizeof to a base
加载更多回复(2)

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧