Передача по значению для нетривиального класса C ++ включает в себя вызов конструктора копирования, поэтому решение в отношении производительности зависит от того, что он делает.
Если мы говорим о MFC / ATL CString
, его конструктор копирования не выполняет глубокое копирование, такое как std::string
(которое действительно может быть довольно дорогостоящим для копирования, поскольку в общем случае требуется новый выделение и копирование полного содержимого), так как он реализует оптимизацию «копирование при записи» - копии данного CString
фактически совместно используют резервный буфер, пока один из них не попытается изменить его, тем самым запустив фактическую копию. По этой причине копии относительно дешевы, но они все еще включают в себя некоторую атомарную целочисленную манипуляцию, которая может быть не полностью бесплатной на современных процессорах.
Итак: скорее всего, ссылка const
будет проходить немного быстрее (даже если доступ к фактическим данным внутри функции будет немного страдать из-за дополнительного шага косвенности), но это не то, что я хотел бы действительно беспокоиться о том, если профилирование не показывает, что это узкое место.