Если вы собираетесь использовать временную переменную, используйте спецификатор const, поэтому компилятор может добавлять оптимизации, зная, что значение не изменится:
string strLine;//not constant
int index = 0;
const int strLenght = strLine.Length();
while(index < strLine.length()){//strLine is not modified};
Скорее всего, сам по себе компилятор выполняет эти оптимизации при доступе к методу Length ().
Редактировать: моя сборка немного ржавая, но я думаю, что оценка происходит только один раз.
Учитывая этот код:
int main()
{
std::string strLine="hello world";
for (int i=0; i < strLine.length(); ++i)
{
std::cout << strLine[i] <<std::endl;
}
}
Создает эту сборку:
for (int i=0; i < strLine.length(); ++i)
0040104A cmp dword ptr [esp+20h],esi
0040104E jbe main+86h (401086h)
Но для этого кода
std::string strLine="hello world";
const int strLength = strLine.length();
for (int i=0; i < strLength ; ++i)
{
std::cout << strLine[i] <<std::endl;
}
генерирует это:
for (int i=0; i < strLength ; ++i)
0040104F cmp edi,esi
00401051 jle main+87h (401087h)
Та же сборка генерируется, если не используется константный квалификатор, поэтому в этом случае это не имеет значения.
Пробовал с VSC ++ 2005