就线程安全性和一般安全性而言,以下代码是否会出现任何问题?
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 :(得分:2)
请勿使用参考参数来存储输出。
只需在函数内创建一个本地std :: string并按值返回。
std::string toHexString( const uint8_t *buf, uint32_t size )
{
std::string out;
// modify 'out'
return out;
}
由于Return Value Optimization之类的编译器技术,它应具有相似的性能,但语义要好得多(不需要虚拟额外参数)。
就线程安全而言,功能可能很好。在线程之间共享数据时,您只需要担心线程安全,并且此函数不应共享任何数据。
答案 1 :(得分:0)
从我们可以看到,该函数本身没有特定的线程安全问题 - 所以只要out
和buf
参数的内容不被其他参数修改,您就可以了。线程在运行时。如果你通过那个宏使用它,或者类似的话,你就不必担心out
- 虽然正如Ethan的答案所说,你最好还是写一个更干净的函数并且只是返回字符串,而不是捣乱与宏。