2016-08-21 24 views
-1

我試圖利用單個函數調用來訪問一個名爲「Data」的類的多個數據成員。在這個特定的例子中,我正在訪問從物理陀螺儀傳感器饋給該類的數據。這是我有:通過單個函數調用訪問特定的相關成員變量的最有效方法是什麼?

template <typename T> 
T Data<T>::getGyro_euler(char c) 
{ 
    switch (c) 
    { 
    case 'x': return m_eulerX; 
    case 'y': return m_eulerY; 
    case 'z': return m_eulerZ; 
    default: return 0; 
    } 
} 

這個函數使用的數據類型始終爲一個浮動或雙。

在這種情況下,性能比清晰度更重要,因爲它運行在一個已經負擔過重的Arduino上,需要執行任務關鍵任務,但是對於手動將一個字符傳遞給一個函數以獲得一個可變的變量。

我有很多像這樣的函數需要傳遞很多變量,因此每個變量的getter函數在代碼中都會變得非常重要。

有沒有更有效的方法來做到這一點?有沒有更好,更清晰的方式來完成同樣的事情而不犧牲性能?

+5

三個功能應該不會影響性能。與你的代碼相比,它甚至應該增加。 – tkausl

+0

我想內聯函數可能會提高性能,但需要花費一些空間。 – Mark

+0

需要更多的上下文才能正確回答這個問題;你爲什麼需要三軸開關?另外,一個好的編譯器會從最終代碼中消除任何獲取者的痕跡。你檢查了結果代碼? – rustyx

回答

1

您可能將您的類命名爲Data,原因是:它(或至少應該是)純數據。不要把它變成一個班級,把它變成一個結構,或者更好,一個POD type

這樣,您只需在點後輸入其名稱即可訪問任何成員:data.eulerX。作爲獎勵,你沒有性能問題,更清晰和更好的可讀性。

1

在我看來,你的方法對你描述的問題來說太複雜了。 正如其他人在評論訪問字段中提到的就足夠了。您可以選擇將意圖一起使用的字段組合在一起,以提高代碼的可讀性,例如使用std :: tuple。

下面是一個不完整的例子(因爲我不知道數據是如何收集的)。 性能成本與代碼行數無關,但更多的涉及代碼涉及的複雜性(例如,在運行時不需要交換機);對於問題中描述的微不足道的類型(雙重),我不認爲這會是一個問題。

#include <tuple> 

struct giroData 
{ 
private: 
    double sensorX; 
    double sensorY; 
    double sensorZ; 
// or 
std::tuple<double, double, double> sensor; 

public : 
    double getSensorX() { return sensorX; } 
    double getSensorY() { return sensorY; } 
    double getSensorZ() { return sensorZ; } 

    std::tuple<double, double, double> getSensor() { return sensor; } 

}; 

int main() 
{ 
    double x, y, z; 
    giroData d; 

    x = d.getSensorX(); 
    y = d.getSensorY(); 
    z = d.getSensorZ(); 

    // or 
    std::tie(x, y, z) = d.getSensor(); 

} 
相關問題