Как обучить компилятор?
От: Аноним  
Дата: 22.01.14 13:15
Оценка: -1 :))) :)
Есть метод который содержит несколько методов:


void MyMethod()
{
    A1();
    A2();
    A3();
//.....
    AN();
}


В дебажной сборке методы A1...AN вызываются в том же порядке как они указаны, а вот в релизе могут меняться местами из-за оптимизации компилятора. Вопрос собственно вот в чем. как сохранить порядок вызовов методов в релизной сборке?
Re: Как обучить компилятор?
От: Rinbe Россия  
Дата: 22.01.14 13:34
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть метод который содержит несколько методов:



А>
А>void MyMethod()
А>{
А>    A1();
А>    A2();
А>    A3();
А>//.....
А>    AN();
А>}
А>


А>В дебажной сборке методы A1...AN вызываются в том же порядке как они указаны, а вот в релизе могут меняться местами из-за оптимизации компилятора. Вопрос собственно вот в чем. как сохранить порядок вызовов методов в релизной сборке?


Сделать так, что бы результат работы метода AN зависел от результата работы метода AN-1.
Re: Как обучить компилятор?
От: hi_octane Беларусь  
Дата: 22.01.14 16:10
Оценка: +3
А>В дебажной сборке методы A1...AN вызываются в том же порядке как они указаны, а вот в релизе могут меняться местами из-за оптимизации компилятора. Вопрос собственно вот в чем. как сохранить порядок вызовов методов в релизной сборке?

А есть тестовый проект на котором такие перестановки можно проверить?
Re: Как обучить компилятор?
От: Artem Korneev США https://www.linkedin.com/in/artemkorneev/
Дата: 23.01.14 01:32
Оценка:
Здравствуйте, Аноним, Вы писали:

А>В дебажной сборке методы A1...AN вызываются в том же порядке как они указаны, а вот в релизе могут меняться местами из-за оптимизации компилятора. Вопрос собственно вот в чем. как сохранить порядок вызовов методов в релизной сборке?


Уж простите, что отвечаю вопросом на вопрос, но — зачем?
Компилятор увидел, что порядок вычислений может быть изменён без вреда для работоспособности программы и поменял очерёдность вызова функций с целью оптимизации. Зачем запрещать ему это делать? Это приводит к каким-то проблемам? Он сам перестанет переупорядочивать вызовы, если увидит, что их очерёдность имеет какое-то значение для алгоритма программы.
С уважением, Artem Korneev.
Re: Как обучить компилятор?
От: drol  
Дата: 23.01.14 13:14
Оценка:
Здравствуйте, Аноним, Вы писали:

А>а вот в релизе могут меняться местами из-за оптимизации компилятора


Оптимизации могут выполняться не только компилятором, но и вообще всеми участниками процесса превращения исходного кода программы в результаты её работы. И конкретно порядок исполнения команд процессор и контроллер памяти могут заоптимизировать даже гораздо круче большинства компиляторов.

Если Вам необходим наблюдаемый снаружи чёткий порядок исполнения, то его необходимо явно обеспечить непосредственно в коде. Для этого существует масса специальных механизмов: lock; volatile-поля; методы класса Interlocked; различные примитивы синхронизации ОС и т.д. и т.п.
Re: Как обучить компилятор?
От: BrainSlug Израиль  
Дата: 23.01.14 13:31
Оценка: :))
я давно уже думаю, как бы так сделать, чтобы компилятор сам код писал. правда, он же потом и зарплату получать захочет...и вот так возвращаешься домой, а там с твоей женой...компилятор...
.
Re: Как обучить компилятор?
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 23.01.14 13:50
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть метод который содержит несколько методов:



А>
А>void MyMethod()
А>{
А>    A1();
А>    A2();
А>    A3();
А>//.....
А>    AN();
А>}
А>


А>В дебажной сборке методы A1...AN вызываются в том же порядке как они указаны, а вот в релизе могут меняться местами из-за оптимизации компилятора. Вопрос собственно вот в чем. как сохранить порядок вызовов методов в релизной сборке?


Ситуация такая: компилятор смотрит на вызовы методом так, как если бы они выполнялись в однопоточном окружении. А если он видит, что можно поменять местами вызовы с целью оптимизации, то так и поступает. Итого:
(1) если логика работы нарушается при однопоточном выполнении, то это баг компилятора;
(2) если логика работы нарушается при многопоточном выполнении, то надо сделать ряд подсказок компилятору (volatile, lock, ...);
(3) если логика работы не нарушаеся, то чем вызвано беспокойство?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.