2016-02-19 4 views
3

У меня есть класс, содержащий указатель реализации. Поэтому в некоторых функциях я несколько раз ссылаюсь на члена реализации. Это хорошая идея, чтобы написатьДолжен ли я использовать ссылку?

// approach 1 
std::string & str = m_pImpl->m_str; 
str.clear(); 
str += "blablabla"; 
// ... 
return str.c_str(); 

один раз и использовать ссылку, чтобы сохранить указатель окольные, или я должен сохранить ссылочную переменную (Это всегда 4 или 8 байт, как указатель, не так ли?)?

// approach 2 
m_pImpl->m_str.clear(); 
m_pImpl->m_str += "blablabla"; 
// ... 
return m_pImpl->m_str.c_str(); 

В моей USECASE переменная m_pImpl-> m_str используется примерно от 10 до 20 раз. Боюсь, я с трудом могу объяснить разницу в производительности между этими двумя подходами. Кто-нибудь знает, или кто-нибудь может его проверить, это имеет значение? Это зависит от того, как часто я использую переменную (один раз против 20 раз по сравнению с 10000 раз)? Или достойный компилятор делает то же самое, что и подход 1?

+0

... Или воспользуйтесь последним и оставьте остальные в компиляторе. Я был бы удивлен, если бы эти подходы скомпилировались в другой код. Используйте все, что вы найдете более читаемым. –

+0

подход 3: 'return m_pImpl-> GetBlablabla();' – Henrik

ответ

4

Не пытайтесь выполнять работу современного компилятора, поскольку они уделяют большое внимание оптимизации кода: уклоняйтесь от намеченных улучшений, таких как эти.

Это не только запутывание, но подход 1 также уязвим для странствующего refactorer опуская & в определении str: если что-либо сделать, то возвращаемый указатель будет оборванными и поведение программы неопределенные! Именно по этим причинам я откажусь от подхода 1 в своей кодовой базе.

3

От 8.3.2 Список литературы § 4

Это не определено, требует ли ссылки системой хранения

Так что я хотел бы предложить использовать код, который выглядит более удобным для чтения к вам, а остальное оставьте компилятору.

Смежные вопросы