联合内部的未知成员函数



我正在读一段代码。我相信这是在C++中:

 union Float_t
 {
    Float_t(float num = 0.0f) : f(num) {}
    // Portable extraction of components.
    bool Negative() const { return (i >> 31) != 0; }
    int32_t RawMantissa() const { return i & ((1 << 23) - 1); }
    int32_t RawExponent() const { return (i >> 23) & 0xFF; }
    int32_t i;
    float f;
    #ifdef _DEBUG
    struct
    {   // Bitfields for exploration. Do not use in production code.
         uint32_t mantissa : 23;
         uint32_t exponent : 8;
         uint32_t sign : 1;
    } parts;
    #endif
};

有人能解释两件事吗?

1.

 Float_t(float num = 0.0f) : f(num) {}   

这句话是在说什么?当f没有定义时,f(num)是什么意思?

2.为什么在代码的后半部分需要#ifdef_DEBUG和#endif?

谢谢。

Float_t(float num = 0.0f) : f(num) {} 

这是一个构造函数,它接受一个设置Float_t::f值的参数。构造函数有一个默认参数,用于将Float_t::f设置为0.0f

构造函数调用示例:

Float_t f1; // f1.f == 0.0f; is true
Float_t f2 = Float_t(3.f); // f2.f == 3.0f; is true

2.为什么在代码的后半部分需要#ifdef_DEBUG和#endif?

代码编写器将这些信息用于调试目的,并且不希望联合的用户访问这些信息。

请注意,如果在生产代码中启用,添加的信息不会影响性能或内存使用情况。

注意,所有联合成员都在相同的内存地址,f1f2的以下信息保持

f1.f == 0.0f; // evaluates to true
f1.i == 0; // evaluates to true
f1.parts.mantissa == 0; // evaluates to true
f1.parts.exponent == 0; // evaluates to true
f1.parts.sign == 0; // evaluates to true
f2.f == 3.0f; // evaluates to true
f2.i == 1077936128; // evaluates to true
f2.parts.mantissa == 4194304; // evaluates to true
f2.parts.exponent == 128; // evaluates to true
f2.parts.sign == 0; // evaluates to true
sizeof(f1) == 4; // evaluates to true
reinterpret_cast<float&>(f2.i) == f2.f; // evaluates to true

编辑

上面代码中的常数值是在小端序配置上获得的,数据的顺序声明为位字段,从低位到高位

最新更新