c++ - 将一个对象分配给另一个对象后,为什么两个对象不一样?

标签 c++

<分区>

我们的 vector 类中有一些奇怪的错误行为。它给我们上了宝贵的一课。

class Vector3D
{
    float x, y, z, w;
public:
    Vector3D( float ax, float ay, float az, float aw )
        : x(ax), y(ay), z(az), w(aw)
    {}
    Vector3D( float ax, float ay, float az ) // for when you don't care about w
        : x(ax), y(ay), z(az)
    {}

    void Assign( const Vector3D& rhs )
    {
        x = rhs.x;
        y = rhs.y;
        z = rhs.z;
        w = rhs.w;
    }
    bool operator==( const Vector3D& o )
    {
        return (x==o.x && y==o.y && z==o.z && w==o.w);
    }
    // lots more stuff
}

int main()
{
    Vector3D a(1.0f,2.0f,3.0f);
    Vector3D b(4.0f,5.0f,6.0f);

    a.Assign(b);
    bool result=(a==b); // Expected: true. Actual: false, sometimes
}

一段时间以来,Assign 函数似乎存在错误。我们会用它来将一个 vector 的值复制到另一个 vector ,但稍后代码将无法匹配我们知道应该相同的点。设置了数据断点,但未能命中。头都被抓破了。最终,我们将代码添加到 Assign 的末尾,它会立即调用 operator== 来检查两个 vector 是否相同……但事实并非如此。

出了什么问题?

最佳答案

问题在于第二个构造函数(仅采用 3 个参数)没有初始化 w。我们非常关心我们代码的性能,在我们知道我们只会使用 x.yz 的情况下,我们没有' 想对第四个成员变量使用任何 CPU 能力。

最终,我们最终看到了一个对象,其 w 恰好包含与 IEEE NaN 相对应的位模式。其中一件有趣的事情是,当您将 NaN 与 NaN 进行比较时,比较总是失败,即使位模式相同。所以我们的 operator== 方法比较未初始化的 w 值,确定两者不相同。

经验教训:永远不要使用未初始化的数据

关于c++ - 将一个对象分配给另一个对象后,为什么两个对象不一样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52393303/

相关文章:

c++ - 错误 : new types may not be defined in a return type

c# - 当 C++ 调用 C# 函数时,如何从 C# 调用 C++ 委托(delegate)函数?

c++ - 不同typeid的if语句

c++ - 宏的逆柯里化(Currying)?

c++ - CPP : Mysterious error for array initialization and crash?

c++ - CodeChef 的子序列等式

c++ - Rails WebService 和 C++ 应用程序公开

C++:调整动态分配数组大小的正确方法是什么?

c++ - 为什么这种 SIMD 乘法不如非 SIMD 乘法快?

c++ - 未提供 .lib 时如何在 visual studio 2010 中添加和使用第三方 .dll