Я смотрю на C ++ 0x темы и имею этот код:
#include <vector>
#include <iostream>
#include <thread>
void TestFunc(const vector<int>& vVec)
{
cout << "in"<<endl;
}
int main()
{
int sizer = 400000000;
vector<int> vTest(sizer);
for(int f=0; f<sizer; f++)
vTest[f] = f;
cout << "V created." << endl;
thread one(TestFunc, vTest);
one.join();
}
Как видите, он просто передает вектор в поток.
Я не понимаю, что после появления сообщения «V создан» возникает пауза. Первоначально это (я предположил) был вектор, который копируется для использования в функции.
Чтобы остановить это, я передал ссылку вместо этого, но это не имело никакого значения.
Задержка кажется пропорциональной размеру вектора, который указывает, что он все еще копирует (или что-то делает с массивом).
Если я попробую тот же эксперимент без потоков и просто вызову функцию напрямую, будет задержка при передаче по значению, но не при передаче по ссылке, как я ожидал.
Я попробовал то же самое, используя потоки Boost вместо C ++ 0x (хотя я читал, что они во многом совпадают) и получил тот же результат.
Есть ли какая-то причина для такого поведения или я пропустил что-то ослепительно очевидное?
Благодаря.
Извините, опубликован неправильный тестовый код. Исправленный.
Изменить: Добавлено включает в себя по запросу.
Скомпилировано с:
g ++ 44 -std = c ++ 0x -lpthread tester.cpp -o test
... поскольку у меня установлен GNU 4.4 вместе со стандартным компилятором GNU, который поставляется с моим Linux (CentOS), который не поддерживает C ++ 11.