ENUM在结构体中占用空间吗

来源:互联网 发布:oracle数据库 中文 编辑:程序博客网 时间:2024/04/29 17:25

http://blog.csdn.net/dadalan/article/details/4493824

     今天在调试网络问题时,突然想到了动态数据包,要用到enum来区分不同的数据包。此时想到一个问题"ENUM在结构体中占用空间吗"

 

于是我写了段代码测试了一下

struct Msg
{
 enum { TAG_SIZE = 3};
 enum { TAG_ID = 5, TAG_ID_1, TAG_ID_2, TAG_ID_3};
 int a;
 int b;
};
void main()
{
 cout<<sizeof(Msg)<<endl;
}

输出结构:

8
Press any key to continue

 

很显然不占空间。那么为什么呢?于是我搜索了下。下面的解释很有道理。基础的巩固不是靠死记硬背能搞定的,想当年我c,c++考试门门90多分,真正在实战中时对一些基础感念总是模棱两可。

ENUM是定义枚举型变量
  在实际问题中, 有些变量的取值被限定在一个有限的范围内。例如,一个星期内只有七天,一年只有十二个月, 一个班每周有六门课程等等。
如果把这些量说明为整型, 字符型或其它类型显然是不妥当的。 为此,C语言提供了一种称为“枚举”的类型。
在“枚举”类型的定义中列举出所有可能的取值, 被说明为该“枚举”类型的变量取值不能超过定义的范围。
应该说明的是, 枚举类型是一种基本数据类型,而不是一种构造类型, 因为它不能再分解为任何基本类型。
struct是结构体  在实际问题中,一组数据往往具有不同的数据类型。例如, 在学生登记表中,姓名应为字符型;学号可为整型或字符型; 年龄应为整型;
性别应为字符型;成绩可为整型或实型。 显然不能用一个数组来存放这一组数据。 因为数组中各元素的类型和长度都必须一致,
以便于编译系统处理。为了解决这个问题,C语言中给出了另一种构造数据类型——“结构”。 它相当于其它高级语言中的记录。
“结构”是一种构造类型,它是由若干“成员”组成的。 每一个成员可以是一个基本数据类型或者又是一个构造类型。 
结构既是一种“构造”而成的数据类型, 那么在说明和使用之前必须先定义它,也就是构造它。
如同在说明和调用函数之前要先定义函数一样。

写了上面一篇后,仍然意犹未尽,想测试下函数,虚函数,当然,从书本上我早知道普通函数不占结构体空间,虚函数有个虚函数指针占四个自己的空间。但是我都是从书本上看到的,一直以来没有真正去测试过。

 

#include <iostream.h>#include <stdlib.h>#include <memory.h>struct Msg{ enum { TAG_SIZE = 3}; enum { TAG_ID = 5, TAG_ID_1, TAG_ID_2, TAG_ID_3}; int a; int b; int func(){ return 0;} int func2() { return 1;} //virtual int func3(){return 0;}};void main(){ char buf[50];    int a = 5; int b = 6; memset(buf, 0, sizeof(buf)); memcpy(buf, (void*)&a, sizeof(int)); memcpy(buf+sizeof(int), (void*)&b, sizeof(int));    Msg msg;

 memcpy((void*)&msg, (void*)buf, sizeof(Msg));

 cout<<sizeof(Msg)<<endl;

 cout<<msg.a<<endl; cout<<msg.b<<endl;}

 

 

大家可以测试下看看有没有虚函数的情况,打印的结果如何。


原创粉丝点击