我正在撰寫一些代碼并意識到我不知道使用哪個更好。每個的好處/缺點是什么?我目前正在使用帶有 const uint16_t 的那個,因為我認為模板化它會通過創建唯一的函式簽名來擴展二進制檔案。預先感謝任何想幫助解釋這一點的人!
template<typename T, uint16_t response_size>
T get_endpoint_value(const uint16_t endpoint_id)
對比
template<typename T, uint16_t response_size, uint16_t endpoint_id>
T get_endpoint_value()
對比
template<typename T>
T get_endpoint_value(serial::Serial* serial,
const uint16_t endpoint_id, const uint16_t response_size)
Whereendpoint_id只是一個被復制到緩沖區中的值。response_size用于uint_t buffer[response_size]在串行資料傳輸期間調整 a 的大小。
uj5u.com熱心網友回復:
基于模板的版本允許編譯器inline呼叫,因為函式的地址在編譯時是已知的。缺點是不能在運行時更改模板引數的值。
因此,如果您想在runtime 中更改引數,則必須使用引數而不是模板引數。請注意,運行時是指應用程式運行時,編譯時是應用程式編譯時。如果在運行時不需要模板,并且response_size/的值endpoint_id在編譯時是固定的/已知的,我會使用模板
uj5u.com熱心網友回復:
總結:除非有特殊原因,否則請使用函式引數。
如果您在編譯時不知道您的引數,則您別無選擇——您不能在模板引數中使用它。讓我們假設您在編譯時就知道它。
如果函式太小以至于編譯器行內它,那么函式引數和模板引數的結果是相同的。如果不是,那么傳遞函式引數所花費的時間很可能可以忽略不計,但額外模板實體化導致的代碼膨脹的影響可能很重要。
現在,偏愛模板引數的特殊原因:
- 這可能允許您避免函式內部的動態記憶體分配。例如,如果您需要一個大小
response_size可以宣告為std::vector<char> buf(response_size);. 但是,如果response_size是模板引數,則可以將其宣告為std::array<char, response_size> buf;,避免動態記憶體。 - 您知道僅可用于編譯時常量的重要編譯時優化。例如,整數除法很慢,但如果除數是一個編譯時常量,它可能會被一系列更快的操作替換。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/368070.html
