2009-12-11 3 views
18

Мне интересно, является ли строка C++ достаточно малой, чтобы быть более эффективной при передаче по значению, чем по ссылке.Передача строк C++ по значению или по ссылке

+0

Почему? То есть, чего вы надеетесь достичь с помощью этих знаний? – wallyk

+0

Возможный дубликат: http://stackoverflow.com/questions/1567138/const-t-arg-vs-t-arg –

+0

Хотя это связано с путешествием во времени, я бы сказал, что теперь это должно быть отмечено как дубликат [Являются ли дни пропустить const std :: string & как параметр через?] (https://stackoverflow.com/questions/10231349/are-the-days-of-passing-const-stdstring-as-a-parameter-over), который является каноническим обсуждением этого вопроса в терминах современного C++. –

ответ

30

No. Pass его по ссылке:

void foo(const std::string& pString); 

В общем, передать вещи по ссылке, если они имеют нетривиальный копировать-конструктор, в противном случае по значению.

Строка обычно состоит из указателя на данные и счетчика длины. Он может содержать более или менее, поскольку это реализация определена, но вряд ли ваша реализация использует только один указатель.

В коде шаблона вы также можете использовать const T&, так как определение функции будет доступно компилятору. Это означает, что он может решить, должно ли оно быть ссылкой или нет для вас. (Думаю)

+5

Ваша эвристика не работает для 'double' и' long double' (которые обычно лучше пропускать по значению). Кроме того, для функций с одним аргументом обычно лучше передавать 2 x машинных слов UDT по значению, поскольку регистры будут использоваться для хранения обеих частей (и сохранения дополнительной косвенности). –

+4

Кроме того, 'sizeof (T)' является очень плохой мерой в целом, хотя бы потому, что он не измеряет истинный размер данных, которые будут скопированы. «string» является особенно хорошим примером этого, поскольку 'sizeof (string)' обычно будет 'sizeof (void *)' на наивной реализации (простой указатель на данные) или два или три слова для оптимизации коротких строк реализация. Тем не менее, когда вы копируете строку, ее конструктор копирования скопирует данные, на которые указывает, для которых неучтенный. То же самое касается 'vector' и многих других. –

+0

Как это? – GManNickG

2

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