2012-09-17 161 views
0

就線程安全性和一般安全性而言,下列代碼是否有任何問題?返回參考傳遞參數

std::string & toHexString(const uint8_t *buf, uint32_t size, std::string &out) 
{ 
    // modify 'out' 
    return out; 
} 

#ifndef TOHEXSTR 
    #define TOHEXSTR(x, y,) (toHexString(x, y, std::string())).c_str() 
#endif 

這將是使用的方法是打印調試語句:

printf("Byte buffer contents: [%s].", TOHEXSTR(buf, buf_size)); 

如果這個實現的問題,應該怎麼改?

謝謝。

+0

你考慮過Boost.Format嗎? – Fanael

+0

提升被禁止。 – MarkP

+0

@Fanael:對於像字符串格式化那樣簡單的事情來說,這麼大的依賴關係似乎是一個壞主意。 –

回答

2

請勿使用參考參數來存儲輸出。

只需在函數內部創建一個本地std :: string並按值返回。

std::string toHexString(const uint8_t *buf, uint32_t size) 
{ 
    std::string out; 
    // modify 'out' 
    return out; 
} 

Return Value Optimization由於編譯器技術,這應該也有類似的表現,但更好的語義(無需額外的虛擬參數)。

至於線程安全性的功能可能是好的。當線程共享數據時,您只需要擔心線程安全問題,並且此函數不應共享任何數據。

0

從我們可以看到,該函數本身沒有特別的線程安全問題 - 所以只要參數的內容在運行時沒有被另一個線程修改,就可以。如果你通過這個宏或類似的方式使用它,那麼你不必擔心out--儘管Ethan的回答指出,你最好是寫一個更乾淨的函數,然後返回字符串,而不是用宏來彌補。