По какой-то причине я хочу вернуть объект my::Vector (который в основном является классом-оболочкой, который внутренне использует вектор STL для фактического хранения, а также предоставляет некоторые дополнительные функции). Я возвращаю вектор по значению, поскольку функция каждый раз создает вектор локально.
my::Vector<int> calcOnCPU()
{
my::Vector<int> v....
return v;
}
Теперь у меня может быть несколько вложенных вызовов функций (учитывая дизайн библиотеки), поэтому вкратце что-то вроде следующего:
my::Vector<int> calc()
{
if(...)
return calcOnCPU();
}
Насколько мне известно, возврат по значению вызовет конструктор копирования класса my::Vector, что-то вроде:
Vector<int>::Vector(const Vector& c)
{
....
m_vec = c.m_vec; // where m_vec is std::vector<int>
}
Несколько вопросов: 1) В конструкторе копирования вызывается ли конструктор копирования std::vector? или оператор присваивания и Просто для подтверждения, std::vector создает глубокую копию (то есть копирует все элементы с учетом базового целочисленного типа). 2) При вложении calcOnCPU() в calc() каждый возвращаемый вектор из int: будет создаваться 2 или 1 копия вектора? Как я мог избежать нескольких копий в случае такой простой вложенности методов? Встроенные функции или есть другой способ?
ОБНОВЛЕНИЕ 1: мне стало очевидно, что мне нужно сохранить свой собственный конструктор копирования, так как есть некоторые пользовательские требования. Однако я сделал простой тест в основной функции:
int main() {
...
my::Vector v = calc();
std::cout<<v;
}
Я поместил несколько отпечатков, используя «std::cerr» в своем конструкторе копирования, чтобы увидеть, когда он будет вызван. Интересно, что она не вызывается ни разу для вышеуказанной программы (по крайней мере, ничего не печатается). Это оптимизация копирования? Я использую компилятор GNU C++ (g++) v4.6.3 в Linux.
my::Vector
, чтобы точно знать ответы на ваши вопросы. И вы уверены, что вам нужен класс-оболочка для добавления дополнительных функций? Разве это не может быть обработано бесплатными функциями? - person Benjamin Lindley   schedule 06.07.2012