回 帖 发 新 帖 刷新版面

主题:一个有关C++位域的程序,感觉有些疑惑,求解

#include<iostream>
using namespace std;

enum Sys {LOW, HIGH};  //系统位数
enum Core {ONE, TWO, FOUR};//cpu单,双,四核
enum Thread {YES, NO}; //是否支持多线程

class Cpu  //Cpu类定义
{
    public:
        Cpu():frequ(0), system(LOW), core(ONE), thread(YES){}
        Cpu(int fre, Sys sys, Core co, Thread th):frequ(fre), system(sys), core(co), thread(th){}
        void show(void);
    private:
        unsigned int frequ : 12;
        Sys system : 1;
        Core core : 2;
        Thread thread : 1;
};

void Cpu::show(void)
{
    cout<<"the cpu information is:"<<endl;
    cout<<"frequency(MHz):"<<frequ<<endl;

    cout<<"the system is:"<<endl;
    switch(system)
    {
        case LOW:
                    cout<<"32bit"<<endl;
                    break;
        case HIGH:
                    cout<<"64bit"<<endl;
                    break;
        default:
                    cout<<"information error!"<<endl;
    }

    cout<<"the core is"<<endl;
    switch(core)
    {
        case ONE:
                cout<<"single core"<<endl;
                break;
        case TWO:
                cout<<"double cores"<<endl;
                break;
        case FOUR:
                cout<<"double double cores"<<endl;
                break;
        default:
                cout<<"information error!"<<endl;
    }

    cout<<"the cpu support over thread:"<<endl;
    switch(thread)
    {
        case YES:
                cout<<"yes"<<endl;
                break;
        case NO:
                cout<<"no"<<endl;
                break;
        default:
                cout<<"information error!"<<endl;
    }
}

int main(void)
{
    Cpu c(2000, HIGH, FOUR, NO);

    c.show();

    cout<<"the size of the class is:"<<sizeof(Cpu)<<endl;

    return 0;
}
调试出来是switch语句有问题,没有执行case,直接执行default,而且sizeof的结果觉得应该是2.

回复列表 (共4个回复)

沙发

以前还没有想过像楼主这样把枚举值作为bitfield来用。

我用VC 2010做测试,从反汇编来看,似乎VC会把枚举值当作是带符号的整数来处理,从这个角度讲,system占1bit是不够的,因为还需要一个符号位,修改为2bit。同理,core修改为3bit,thread修改为2bit。这样运行的话,输出就正确了。
另外,把Sys system : 1,修改为unsigned int system : 1,这样也能得到正确输出,且节省一个符号位。

关于sizeof,这个比较诡异。
还是用2010测试,发现把所有的bitfield修改为unsigned int,输出sizeof为4,但所有的bitfield修改为unsigned short,则输出sizeof为2。

等待其他同学的解释。

板凳


兄才,有同感,两种方法都试过了,有同感, 关于sizeof是4,应该是因为VC没有对内存压缩处理,有些编译器就会对内存压缩。

3 楼

编译器有个选项:将enum当成int。
默认这个是关闭的,这时对于程序来说,enum会使用最小的内存占用。

4 楼


那VC是哪个选项呢。

我来回复

您尚未登录,请登录后再回复。点此登录或注册