Я смотрел на потоки 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 (хотя я читал, что они практически одинаковы) и получил тот же результат.
Есть ли какая-то причина для такого поведения или я пропустил что-то ослепительно очевидное? Спасибо.
Извините, разместил не тот тестовый код. Исправлено. Edit: Добавил include, как просили.
Скомпилировано с: g++44 -std=c++0x -lpthread tester.cpp -o test ...поскольку у меня установлен GNU 4.4 наряду со стандартным компилятором GNU, поставляемым с моим Linux (CentOS), который не поддерживает C++11.