В этом ответном переполнении стека показано, что сглаживание на С++ может замедлить ваш код. И наложение псевдонимов на С++ относится не только к указателям, но и к ссылкам, а в более общем смысле - к этим типам, указанным в стандарте. В частности, существует
совокупность или тип объединения, который включает один из вышеупомянутых типов среди его членов (включая рекурсивно, член субагрегата или содержащегося объединения)
Итак, согласно моему пониманию, если у меня есть код, как показано ниже,
class A{
public:
int val;
};
void foo(vector<A> & array, int & size, A & a0) {
for(int i=0;i<size;++i) {
array[i].val = 2*a0.val;
}
}
и возможно, что a0
может быть одним из элементов в array
, также возможно псевдоним size
из-за вышеупомянутой цитаты, поэтому a0
и size
должны быть загружены для каждой итерации в результате при снижении производительности.
- Тогда мой вопрос - что мне делать с кодом, чтобы избежать наложения псевдонимов и улучшить производительность?
- Передача
const &
не поможет, поскольку она не избежит сглаживания, как указано в стандарте. Пропуститьa0
по значению? Но это сделает копированиеa0
, которое мне не нравится, поскольку на практике классA
может быть очень сложным, и копирование является очень дорогостоящим вариантом. - Есть ли общее решение, чтобы избежать сглаживания в С++? Если да, то что это такое?