Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Оптимизация через static переменную внутри функции


Автор: SABROG 14.4.2010, 23:38
Вопрос теоретический.

Код

void foo(int arg)
{
    const int value = externalFunctionFromDll(arg);
    static const MyClass mc = func(value);
    mc.bar();
}


Предположим, что функция externalFunctionFromDll() может возвращать различные значения и компилятору конечно ничего о ней не известно на этапе компиляции. Статический экземпляр класса MyClass инициализируется 1 раз при первом вхождении в функцию foo(), внутреннее состояние копии экземпляра класса MyClass зависит от того что вернет функция func(), результат которой зависит от параметра value.

Сможет ли компилятор оптимизировать функцию foo() таким образом, чтобы функция externalFunctionFromDll() вызывалась лишь один раз, при первом вхождении в функцию, или её вызов будет происходить каждый раз?

Если я перепишу функцию таким образом
Код

void foo(int arg)
{
    static const int value = externalFunctionFromDll(arg);
    static const MyClass mc = func(value);
    mc.bar();
}


Сможет ли компилятор провести оптимизацию таким образом, чтобы под переменную value не отводилась постоянная ячейка памяти, так как она не используется нигде кроме как для передачи в качестве параметра и то один раз при инициализации mc?

Автор: mes 14.4.2010, 23:53
Цитата(SABROG @  14.4.2010,  22:38 Найти цитируемый пост)

Сможет ли компилятор оптимизировать функцию foo() таким образом, чтобы функция externalFunctionFromDll() вызывалась лишь один раз, при первом вхождении в функцию, или её вызов будет происходить каждый раз?

нет.. он сможет выкинуть value, но не вызов функции, тем более у которой могут быть сторонние эффекты.. 

Цитата(SABROG @  14.4.2010,  22:38 Найти цитируемый пост)
Сможет ли компилятор провести оптимизацию таким образом, чтобы под переменную value не отводилась постоянная ячейка памяти, так как она не используется нигде кроме как для передачи в качестве параметра и то один раз при инициализации mc? 

да, насколько я знаю, если к ней не применяется операция взятия адреса.

Автор: borisbn 15.4.2010, 09:01
Цитата(SABROG @  14.4.2010,  23:38 Найти цитируемый пост)
Сможет ли компилятор провести оптимизацию таким образом, чтобы под переменную value не отводилась постоянная ячейка памяти

насколько я знаю под const int никогда не отводится ячейка, а он работает как типизованный define

Автор: mes 15.4.2010, 09:18
Цитата(borisbn @  15.4.2010,  08:01 Найти цитируемый пост)
никогда

 smile 

Автор: azesmcar 15.4.2010, 10:01
Цитата(borisbn @  15.4.2010,  09:01 Найти цитируемый пост)
насколько я знаю под const int никогда не отводится ячейка, а он работает как типизованный define 

Код

const int i = 0;
std::cout << &i << std::endl;

а что же тогда тут выводится? smile 

Автор: borisbn 15.4.2010, 10:30
mes, azesmcar, sorry, конечно же. Просто неправильно выразился. Присоединяюсь к 
Цитата(mes @  14.4.2010,  23:53 Найти цитируемый пост)
если к ней не применяется операция взятия адреса



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)