2013-03-18 4 views
0

Как я знаю, объявление переменных типов POD или примитивных типов внутри циклов в порядке (без накладных расходов).C++ - Объявление ссылочных переменных внутри циклов?

Как насчет ссылочных переменных?
Имеет ли значение производительность, объявлять ссылочные переменные внутри циклов?

Например, переменная ссылки на вектор, как показано ниже:

vector<vector<int> > data (100, vector<int> (100)); 
for (int i = 0; i < 100; ++i) { 
    vector<int> &row = data[i]; 
    ... 
} 

Там не будет никаких накладных расходов, не так ли?

спасибо.

+2

Вы также можете использовать «для (auto & row: data)» {} "при использовании C++ 11 – jt234

+0

Попробовали ли вы разницу с другими кодами? Что будет альтернативой? Почему вы хотите объявить внутри цикла? – Floris

+7

'' – 2013-03-18 14:10:23

ответ

1

С точки зрения производительности ссылки являются сложными с точки зрения вычислительной техники как указатели (и обычно они реализуются внутренне таким же образом).

Инициализация самой ссылки не имеет лишних накладных расходов, а затем инициализирует указатель.

Хотя, исходя из вашего варианта использования, вам, вероятно, будет проще и эффективнее (если немного более подробно) использовать итератор.

vector<vector<int> > data (100, vector<int> (100)); 
for (vector<vector<int> >::iterator row = data.begin(); row != data.end(); ++row) { 
    // (*row)[0] = 1; 
} 
+0

Я тоже хотел знать теоретические предпосылки, спасибо! – noname

+0

для записи, итераторы, как правило, разработаны с эффективным обходом в уме и часто лучше, чем что-то делать самостоятельно. – Wug

0

Не должно быть накладных расходов, потому что ссылка в основном является памятью. В 32-разрядном приложении ячейка памяти имеет 4 байта, поэтому объявление этой вещи внутри цикла имеет одинаковую накладную стоимость, как объявление int: пренебрежимо мало.

+0

Спасибо, тоже! – noname

+0

В любое время братья. (Я не сказал «bro» из-за диапазона подсчета символов) –

Смежные вопросы