С точки зрения безопасности потоков и общей безопасности, будет ли в следующем коде что-то не так?
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 ) );
Если есть проблема с этой реализацией, что следует изменить?
Благодарю.
Не используйте ссылочный параметр для хранения вывода.
Просто создайте локальную строку std :: string внутри функции и верните ее по значению.
std::string toHexString( const uint8_t *buf, uint32_t size )
{
std::string out;
// modify 'out'
return out;
}
Из-за методов компилятора, таких как Оптимизация возвращаемого значения, это должно иметь аналогичную производительность, но гораздо лучшую семантику (не нужно использовать фиктивный дополнительный параметр).
Что касается безопасности потоков, функция, вероятно, в порядке. Вам нужно беспокоиться о безопасности потоков только тогда, когда данные распределяются между потоками, и эта функция не должна совместно использовать какие-либо данные.
Из того, что мы видим, сама функция не имеет особых проблем с безопасностью потоков — так что все будет в порядке, пока содержимое out
а также buf
параметры не изменяются другим потоком во время его работы. Если вы используете его в этом макросе или аналогичным образом, вам не придется беспокоиться о out
— хотя, как отмечает ответ Этана, вам гораздо лучше написать чистую функцию и просто вернуть строку, а не копаться в макросах.