c ++异常和不良的联合阅读

时间:2013-01-23 23:36:27

标签: c++ exception

我有一个包含union作为字段的类。联盟是指向两个不同类的指针。作为第二个字段,我的类包含一个标志,通知当前存储的类型。

class Item {
    std::string *title;
    bool who_am_I;
    union { Submenu *smenu; Function *call; } content;
    public:
    bool am_I_a_submenu();
    bool am_I_a_function();
    Submenu *give_me_submenu();
    Function *give_me_function();
    /*(...)*/
};

现在,在每次使用我的“give_me”方法之前,我敦促用户通过访问标志的适当方法检查类型,即“am_I”方法。然而,如果用户碰巧忘记它,我希望我的库能够抛出适当的异常。如果不检查“give_me”方法中的标志,我可以这样做吗?我问,因为这意味着在正常使用中,标志被不必要地检查两次。

我想知道,一旦类型冲突出现导致程序出现故障,c ++是否以及何时会在构建异常中抛出一些内容。或者也许我应该处理这种情况,否则最好不要再检查标志。

3 个答案:

答案 0 :(得分:4)

好的,首先......为什么你会关心是否检查过两次旗帜? 真的是否是产品中严重的性能瓶颈,分析显示必须进行优化?我非常非常怀疑它。

但即使是性能瓶颈,更重要的是什么?一个正常运行的应用程序不会崩溃,在我看来是一个可接受的权衡,可以获得极少量的额外开销。

但你应该重新设计你的界面,这样用户总能知道他有什么,不会犯这样的错误。

答案 1 :(得分:1)

无法检查联合中存储的内容。如果您使用union,则由您决定是否始终访问正确的元素。读取错误的行为是未定义的行为,不会抛出异常。

我不知道你在做什么,但我建议你根本不要使用union。这是一种老式的方式来节省一些内存,不值得它可能引入的错误。在你的情况下,它根本不保存内存(由于内存对齐,布尔前面的内存与指针一样多)。

答案 2 :(得分:0)

通过使用联合,您告诉编译器这两种类型是兼容的。通常从两者转换会导致编译时问题,因为没有用户指定的,也没有默认转换,但是由于您将其定义为联合,因此默认转换为两种类型。

我会假设在这种情况下,检查布尔值的额外调用可能不会太昂贵。