在包含预先计算或可计算结果的结构中使用联合

时间:2019-03-10 00:42:40

标签: c++ data-structures union

所以我有一个需要创建的结构。本质上,其目的是从各种函数中返回这些结构的数组。所有这些结构都将被收集(可能是几百个),然后我将需要最少的结构。

因此,总而言之,我会遇到这样的情况,其中会有许多结构,但是仅其中之一需要正常值。

正因为如此,我试图创建一个结构来捕捉这个想法。这样,一个选定的结构可以包含其法线或一种计算它的方法。因此,我设计了以下结构:

struct result {
    float t;
    bool calculated; // Tells whether to use result.normal.norm or result.norm.calculate()
    union normal {
        float2 norm;
        float2 (*calculate)();
    };
};

这是表达这个想法的正确方法吗?

*例如,出于某些原因,这些法线计算可能涉及某些计算,例如使用trig来找出复杂曲面上的法线。我们只想在绝对必要的情况下进行计算。

1 个答案:

答案 0 :(得分:0)

(我不相信您提供了足够的上下文来完全回答您的问题,但是我会根据您给我的内容进行尝试。)

  

这是表达这个想法的正确方法吗?

由于您似乎关心性能-可能不关心。通过函数指针调用函数通常很昂贵(编辑:)。而且,该函数甚至在调用时都无法获得t字段的值...因此,这甚至可能行不通。

那你该怎么办?

首先,弄清楚这是否是痛点。性能。不要仅仅进行优化,因为存在优化的潜力。

假设这对优化很有用-尝试避免整个结果的实现。相反,确定哪个流通量需要其规范,然后愿意花费一些精力来获得该规范。不会那么糟糕,因为您只需要为一个数据而不是全部数据工作。

PS-如今无需使用联合,在C ++ 17中我们有std::variant。这样也可以为您节省布尔值。