Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Оптимизация через static переменную внутри функции 
V
    Опции темы
SABROG
  Дата 14.4.2010, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



Вопрос теоретический.

Код

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?


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 14.4.2010, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



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

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

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

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

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


Это сообщение отредактировал(а) mes - 14.4.2010, 23:56


--------------------
PM MAIL WWW   Вверх
borisbn
Дата 15.4.2010, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



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

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


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
mes
Дата 15.4.2010, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



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

 smile 


--------------------
PM MAIL WWW   Вверх
azesmcar
Дата 15.4.2010, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



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

Код

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

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

PM   Вверх
borisbn
Дата 15.4.2010, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



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





--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1248 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.