Этот вопрос (код ниже) std::async and object copy заставил меня задуматься о копировании/перемещении больших реализаций библиотеки. Например, это составляет 5 экземпляров. Контрмеры могут быть сложными, например, в случае async, где передача по ссылке в противоположность значению может вызвать проблемы с параллелизмом. Перемещение конструкторов также не всегда дешево.действительно ли подсчет ходов вызывает эффект Гейзенберга?
Мой вопрос может контрмеры, как найти способ пройти по ссылке действительно решить проблему, которая не существует? Я предполагаю, что большинство, если не все библиотечные функции, окажутся вложенными, они часто представляют собой только одну или две строки кода. Я, конечно, все еще получаю пять «delete obj» на выходе, потому что компилятор должен следовать правилу как будто. Если бы я убрал побочный эффект деструктора, не печатая, как бы правило бы правило, и в итоге получилось бы только одно копирование/перемещение в выпусках?
Есть ли вещи, которые я должен соблюдать при написании конструкторов перемещения, чтобы не путать компилятор или непреднамеренно вводить побочные эффекты и останавливать его от оптимизации?
class obj {
public:
int val;
obj(int a) : val(a) {
cout << "new obj" << endl;
}
~obj() {
cout << "delete obj" << endl;
}
};
void foo(obj a) {
this_thread::sleep_for(chrono::milliseconds(500));
cout << a.val << endl;
}
int main(int argc, int **args) {
obj a(5);
auto future = async(foo, a);
future.wait();
return 0;
}
вы преследуете меня или просто типа вопроса, который я задаю;) – odinthenerd
@PorkyBrain: Ничего личного, я обещаю ;-) –