空类和空结构体

问题引入:经常看到有人说,在C++中如果定义空类/空结构,用sizeof对其取长度结果是1

疑问:对于这个结果个人比较困惑,无法确定是否正确,所以做了一系列测试来验证说法

 

测试环境:gcc 3.4.4vc++6.0CVI8.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的正确性,笔者特地将代码转换成汇编查看了一下,结果确实如前面所述,丝毫不差!

 

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

 

总结:

1gcc下空结构,或者类空结构,其sizeof返回0

2g++下空类或者空结构其sizeof返回1,对类空类或者类空结构体其sizeof返回0

3VC6.0下空类或者空结构,类空类或者类空结构,其sizeof返回1

4。在上述测试环境下,在CVI8.0.0(一个C编译器中),上述代码无一能进行编译,所以重申一点,编译器对一些代码的写法的

支持是测试代码的前提,比如上述代码编译器必须支持空类/空结构的定义,和类空类/类空结构的定义!

 

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Treazy/archive/2007/12/21/1957287.aspx

 

 

 

二。为什么sizeof的返回值是1呢?

 

DonaldKnuth:
呵呵,如果你想一想如果你建立一个空结构体的对象,如果这个结构体的sizeof==0的话,系统该如何给这个对象分配内存空间呢?


dx30611:
里面包含一个指向自己的指针 应该等于4

studyall123:
因为必须保证结构体的每一个实例在内存中都有独一无二的地址

studyall123:
http://www.openitpower.com/wenzhang/115/12675_1.html

cmail:
编译器在里面悄悄插了个char型变量

winner8080:
cmail():
能解释一下你的说法吗


cmail:
为了使类的对象在内存中有一席之地,类的不同对象有唯一的物理地址
所以类不能没有非静态数据成员。所以插入了一个。

zswang:
#pragma pack(2)

typedef struct
{
} STRUCT_NULL;

void __fastcall TForm1::Button1Click(TObject *Sender)
{
   Caption = IntToStr(sizeof(STRUCT_NULL)); //2
}

语言的差别,我在Delphi里调试结果为0

不是什么都要找个道理来解释,编程的东西是人为规定的,结果就是道理。

sunmc:
回复人:studyall123(战略高手(一切从最简单的做起)) ( 三级(初级)) 信誉:100 2007-4-9 22:14:46 得分:0


因为必须保证结构体的每一个实例在内存中都有独一无二的地址

正解


merlinfang:
sizeof
是编译时决定,delphi有自己的做法不奇怪

 

 

 

 

 

 

你可能感兴趣的:(struct,gcc,测试,button,Delphi,编译器)