C ++类与实用程序函数

时间:2013-01-26 18:13:33

标签: c++

所以我可能想要在一条线上运行的各种功能:

inline float yIntercept(const vec2& ptA, const vec2& ptB, float x);
inline float xIntercept(const vec2& ptA, const vec2& ptB, float y);
inline bool lineIntersection(const vec2& ptA0, const vec2& ptB0, const vec2& ptA1, const vec2& ptB1);

对于代表该行的每一行,函数需要2个点。

或者我可以编写一个包含这两个点的线类和各种有用的线相关方法。

struct Line {
    ... stuff

    inline float xIntercept(float y);
    inline float yIntercept(float x);

    inline bool lineIntersection(const Line& other);

    vec2 m_point[2];
};

我想到的一件事就是每当我需要调用其中一个函数给出2分时,就创建这个行类的实例。

我可能在表示多边形的点列表上操作,并且实际上没有实例化任何线对象。

我可以随时致电

yIntercept(somePointA, somePointB, 3.0f);

Line(somePointA, somePointB).yIntercept(3.0f);  //I think this would compile

我喜欢为这些类型的东西而不是C样式函数创建类的想法,但我想知道是否存在创建类的实例这样的性能损失,而不是仅仅将点传递给函数。也许编译器做了一些优化?

2 个答案:

答案 0 :(得分:1)

  

我正在考虑的一件事是创建实例的性能   每次我需要调用其中一个函数时,这个行类   只给了2分。

如果您的应用程序确实存在问题,那么您可能“做错了”。我的意思是,做得对,创建这个对象的代码应该非常轻量级。即便如此,你真的需要创造很多这样的对象 - 构成线条的“事物”随着时间的推移而不是主张,所以struct Line可以以某种方式成为覆盖对象的一部分。

例如,在多边形中,您可以从点列表中创建Line对象,并保留它们。

我还要先编写一个通用的,运行良好的代码库,然后在一切正常工作时进行优化。如果你必须重写一些东西,那就这样吧。希望您已经使您的界面足够通用,您不必重写太多其他代码。

无论何时进行性能优化,请确保您进行测量,再次测量,并记下您为改变它所做的工作。我有时在电子表格中有几百行,“尝试修改X”,“在功能A中使用聪明的技巧”,结果 - 有时结果是“丢失5%”(或“损失500%”),但是至少你知道结果是什么。使用“我认为编译器将执行此操作”需要很多任何给定编译器的经验。

答案 1 :(得分:1)

根据其他因素选择解决方案。或许是努力或可读性。

采用这种方法的原因是因为您在这两种情况中进行选择:

  1. 进行创建Line个对象的额外工作。
  2. 进行将更多参数传递给函数的额外工作。
  3. 编译器可以对1.或2进行优化。它可能会。或不。它可能会有所帮助。或者不是。

    请参阅此文章,详细了解与您类似的优化决策。作者没问题。

    http://www.codinghorror.com/blog/2009/01/the-sad-tragedy-of-micro-optimization-theater.html