Вернуть ссылку параметра передачи по ссылке

С точки зрения безопасности потоков и общей безопасности, будет ли в следующем коде что-то не так?

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

Решение

Не используйте ссылочный параметр для хранения вывода.

Просто создайте локальную строку std :: string внутри функции и верните ее по значению.

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

Из-за методов компилятора, таких как Оптимизация возвращаемого значения, это должно иметь аналогичную производительность, но гораздо лучшую семантику (не нужно использовать фиктивный дополнительный параметр).

Что касается безопасности потоков, функция, вероятно, в порядке. Вам нужно беспокоиться о безопасности потоков только тогда, когда данные распределяются между потоками, и эта функция не должна совместно использовать какие-либо данные.

2

Другие решения

Из того, что мы видим, сама функция не имеет особых проблем с безопасностью потоков — так что все будет в порядке, пока содержимое out а также buf параметры не изменяются другим потоком во время его работы. Если вы используете его в этом макросе или аналогичным образом, вам не придется беспокоиться о out — хотя, как отмечает ответ Этана, вам гораздо лучше написать чистую функцию и просто вернуть строку, а не копаться в макросах.

0

По вопросам рекламы [email protected]