空类与空结构的大小

问题引入:经常看到有人说,在C++中如果定义空类/空结构,用sizeof对其取长度结果是1,
疑问:对于这个结果个人比较困惑,无法确定是否正确,所以做了一系列测试来验证说法

测试环境:gcc 3.4.4,vc++6.0,CVI8.0.0

在msdn中对sizeof的使用中有如下一句话
引用:"...The sizeof operator never yields 0, even for an empty class...."
也就是说sizeof不会返回0,那是不是确实是这样的呢?
具体sizeof的使用可以参见msdn!

由于结构体和类的性质基本上相同,而且为了使代码可以在gcc中编译
因此在测试程序中只定义了结构体

约定:为了方便阐述问题,先在叙述前确定几个名词
空结构或者空类:只有关键字的空壳结构或者类
类空结构或者类空类:在空结构或者空类基础上在其内部添加一个成员变量char a[0]; (无任何参考,只是人为约定)

程序保存在test.c中

测试程序如下:

类空结构或者类空类:

#include <stdio.h>
struct A
{
 char a[0];
};
int main()

 printf("%d", sizeof(struct A));
 return 0;
}

GCC下:
用gcc编译指令
$ gcc -g -Wall test.c -o test
或者g++编译指令
$ g++ -g -Wall test.c -o test

$ ./test
运行输出:
0   ->这个结果直接推翻了sizeof不返回0的说法,看来是gcc编译器扩展后的一些问题

在VC6.0下
直接编译运行输出:
1   ->与预期一致,因为char a[0],a确实未占用任何空间,此时A相当于是个空类


将上面的程序进行修改一下

空结构或者空类:

#include <stdio.h>
struct A
{
 //直接定义一个空类
};
int main()

 printf("%d", sizeof(struct A));
 return 0;
}

GCC下:
用gcc编译运行输出:
0
但是用g++编译运行却输出:
1

在VC6.0下
直接编译运行输出:
1

为了确定gcc的正确性,笔者特地将代码转换成汇编查看了一下,结果确实如前面所述,丝毫不差!

另外,再次说明如果将结构体换成类,其余不变,结果也如上面所说

总结:
1。gcc下空结构,或者类空结构,其sizeof返回0
2。g++下空类或者空结构其sizeof返回1,对类空类或者类空结构体其sizeof返回0
3。VC6.0下空类或者空结构,类空类或者类空结构,其sizeof返回1
4。在上述测试环境下,在CVI8.0.0(一个C编译器中),上述代码无一能进行编译,所以重申一点,编译器对一些代码的写法的
支持是测试代码的前提,比如上述代码编译器必须支持空类/空结构的定义,和类空类/类空结构的定义!
 

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值