В дебажной сборке методы A1...AN вызываются в том же порядке как они указаны, а вот в релизе могут меняться местами из-за оптимизации компилятора. Вопрос собственно вот в чем. как сохранить порядок вызовов методов в релизной сборке?
А>В дебажной сборке методы A1...AN вызываются в том же порядке как они указаны, а вот в релизе могут меняться местами из-за оптимизации компилятора. Вопрос собственно вот в чем. как сохранить порядок вызовов методов в релизной сборке?
Сделать так, что бы результат работы метода AN зависел от результата работы метода AN-1.
А>В дебажной сборке методы A1...AN вызываются в том же порядке как они указаны, а вот в релизе могут меняться местами из-за оптимизации компилятора. Вопрос собственно вот в чем. как сохранить порядок вызовов методов в релизной сборке?
А есть тестовый проект на котором такие перестановки можно проверить?
Здравствуйте, Аноним, Вы писали:
А>В дебажной сборке методы A1...AN вызываются в том же порядке как они указаны, а вот в релизе могут меняться местами из-за оптимизации компилятора. Вопрос собственно вот в чем. как сохранить порядок вызовов методов в релизной сборке?
Уж простите, что отвечаю вопросом на вопрос, но — зачем?
Компилятор увидел, что порядок вычислений может быть изменён без вреда для работоспособности программы и поменял очерёдность вызова функций с целью оптимизации. Зачем запрещать ему это делать? Это приводит к каким-то проблемам? Он сам перестанет переупорядочивать вызовы, если увидит, что их очерёдность имеет какое-то значение для алгоритма программы.
Здравствуйте, Аноним, Вы писали:
А>а вот в релизе могут меняться местами из-за оптимизации компилятора
Оптимизации могут выполняться не только компилятором, но и вообще всеми участниками процесса превращения исходного кода программы в результаты её работы. И конкретно порядок исполнения команд процессор и контроллер памяти могут заоптимизировать даже гораздо круче большинства компиляторов.
Если Вам необходим наблюдаемый снаружи чёткий порядок исполнения, то его необходимо явно обеспечить непосредственно в коде. Для этого существует масса специальных механизмов: lock; volatile-поля; методы класса Interlocked; различные примитивы синхронизации ОС и т.д. и т.п.
я давно уже думаю, как бы так сделать, чтобы компилятор сам код писал. правда, он же потом и зарплату получать захочет...и вот так возвращаешься домой, а там с твоей женой...компилятор...
А>В дебажной сборке методы A1...AN вызываются в том же порядке как они указаны, а вот в релизе могут меняться местами из-за оптимизации компилятора. Вопрос собственно вот в чем. как сохранить порядок вызовов методов в релизной сборке?
Ситуация такая: компилятор смотрит на вызовы методом так, как если бы они выполнялись в однопоточном окружении. А если он видит, что можно поменять местами вызовы с целью оптимизации, то так и поступает. Итого:
(1) если логика работы нарушается при однопоточном выполнении, то это баг компилятора;
(2) если логика работы нарушается при многопоточном выполнении, то надо сделать ряд подсказок компилятору (volatile, lock, ...);
(3) если логика работы не нарушаеся, то чем вызвано беспокойство?