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; }
大家可以测试下看看有没有虚函数的情况,打印的结果如何。