Первый пример, вероятно, должен быть похож на один из следующих:
void getLines(std::string in, std::vector<std::string> &out);
void getLines(std::string in, std::vector<std::string> *out);
Второй стиль часто более удобен, и теоретически его можно сделать в основном таким же эффективным, как и первый:
http://en.wikipedia.org/wiki/Return_value_optimization
То, будет ли это видно на практике, зависит от компилятора, уровней оптимизации и от того, сможет ли компилятор определить эту возможность в первую очередь.
Хотя я говорю не за всех, мне никогда не удавалось заставить компиляторы использовать преимущества RVO, даже с простыми объектами, которые не делают ничего фантастического. Поэтому я лично рекомендую первый подход, потому что вы гарантированно получите желаемое поведение на каждом компиляторе и (что кажется мне актуальным ...) для кода каждого программиста - то есть, что объект, созданный для хранения возврата значение заполняется непосредственно вызываемой функцией без каких-либо дополнительных копий.
(Стоимость создания объекта результата по умолчанию, которого потенциально можно было бы избежать, если использовать RVO, обычно незначительна по сравнению с копией, которую компилятор мог бы избежать.)
Еще один момент, на который следует обратить внимание: если вы пытаетесь избежать ненужных копий, передача объектов по константной ссылке, а не по значению часто является хорошей идеей, например ::
void getLines(const std::string &in, std::vector<std::string> &out);
void getLines(const std::string &in, std::vector<std::string> *out);