Использование объединения в структуре, которая содержит предварительно рассчитанные или вычисляемые результаты - PullRequest
0 голосов
/ 10 марта 2019

Итак, у меня есть структура, которую мне нужно создать. По сути, его цель состоит в том, что массив этих структур будет возвращен из множества функций. Все эти структуры будут собраны (возможно, несколько сотен), и тогда мне понадобится норма для наименьшего из них.

Итак, чтобы подвести итог, у меня есть ситуация, когда таких структур будет много, однако нормальное значение потребуется только для одного из них.

Как таковой, я пытался создать структуру, которая отражает эту идею. Таким образом, выбранная структура может содержать нормальный метод или метод для ее вычисления. Поэтому я разработал следующую структуру:

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

Это правильный способ выразить эту идею?

* Для примера некоторые из этих нормальных вычислений могут включать в себя некоторые вычисления, такие как триг, чтобы вычислить нормаль на сложной криволинейной поверхности. Мы хотели бы рассчитать это только в случае крайней необходимости.

1 Ответ

0 голосов
/ 10 марта 2019

(Я не думаю, что вы предоставили достаточно контекста, чтобы полностью ответить на свой вопрос, но я постараюсь на основе того, что вы мне дали.)

Это правильный способ выразить эту идею?

Так как вы, кажется, обеспокоены производительностью - вероятно, нет. Вызов функции через указатель на функцию (edit :) часто дорогой. Более того, эта функция даже не получает значение поля t при его вызове ... так что это, вероятно, даже не будет работать.

Что тебе тогда делать?

Во-первых, выясните, не является ли это даже болевым пунктом с.р. спектакль. Не просто оптимизируйте это, потому что есть потенциал для оптимизации.

Предполагая, что это полезно для оптимизации - старайтесь избегать всей этой материализации результатов. Вместо этого определите, какой тип поплавка нуждается в его норме, а затем попытайтесь потратить некоторое усилие на его получение; это будет не так уж плохо, поскольку вы будете выполнять работу только с одним фрагментом данных, а не со всеми.

PS - В наши дни не нужно использовать союзы, у нас есть std::variant в C ++ 17. Это спасло бы вас и от логического значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...