簡體   English   中英

類型之間的轉換

[英]Conversion between types

這是關於班級設計的問題。 我對編譯器如何處理這兩個類感到困惑。 作為一種面向對象的語言,C ++需要優化抽象層或類型抽象層以提高效率。 我可以考慮的一個示例是迭代器。 它們是與指針完全不同的類型,但是編譯器可以進行優化,例如在for循環中,其效率與指針相同。

我擔心的是,如果這兩個類只有一個,那么如何使它們效率更高。 這兩個類是Point3和Vector3的數學表示。

Point3上的運算確實很有限,但是在數學上,我們可以通過從Origin減去Point3來從Point3制作出Vector3。 我們也可以通過將Vector3的末端視為Point3來做相反的事情。

例如,縮放Point3。

Point3<float> positionStart;
Vector3<float> scale;
Point3<float> positionEnd;

positionEnd = scale * positionStart;

這應該將positionStart Point3轉換為Vector3,進行乘法運算,然后獲取臨時Vector3的終點,將其分配給positionEnd

我們如何在C ++中高效地對此進行編碼,以使這些轉換實際上不會發生。 因為最后Point3和Vector3由3個浮點數表示。 在運行時,應該算是Point3還是Vector3,但編譯器應該關心類型而不是處理器。

我希望這很清楚,如果沒有,我會盡力解釋我的困惑。

謝謝

**更新**為了更加關注問題,可以使用轉換構造函數或轉換來完成。 運營商。 內部實際上是相同的。 我猜通過內聯,這些構造函數和轉換運算符將使編譯器能夠看到低谷並進行優化。

最簡單的方法是將點坐標作為矢量存儲在內部。 由於我不知道operator*會做什么,因此我將在operator+上顯示清楚的語義(但是請注意,這是未經測試的代碼):

template<typename Field> class Point
{
public:
  Point& operator+=(Vector<Field> const& v);
  // the rest of the Point interface
private:
  Vector<Field> position; // holds the vector from the origin to this point
};

template<typename Field>
 inline Point<Field>::operator+=(Vector<Field> const& v)
{
  position += v;
}

template<typename Field>
 inline Point<Field> operator+(Point<Field> p, Vector<Field> const& v)
{
  return p += v;
}

現在, p += v將被優化為p.position += v如果position不是私有的將被編譯為的確切代碼。 因此,最終您只有一個向量加法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM