|
|
|
Инлайновая функция |
|
|
|
Jul 11 2018, 10:01
|
Местный
Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682
|
Цитата(jcxz @ Jul 11 2018, 09:57) Так что - даже если современные версии компиляторов не инлайнят, то ничто не мешает инлайнить последующим версиям. Имхо все идет именно к этому. Стандарт отдает работу с volatile на усмотрение компилятору. Цитата What constitutes an access to an object that has volatile-qualified type is implementation-defined.
Сообщение отредактировал aiwa - Jul 11 2018, 10:02
|
|
|
|
|
Jul 11 2018, 10:17
|
Местный
Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682
|
Насколько я понимаю, под реализацией имеется ввиду компилятор+платформа. Но по поводу доступа к volatile говорится Цитата Note: volatile is a hint to the implementation to avoid aggressive optimization involving the object because the value of the object might be changed by means undetectable by an implementation. Что это всего лишь подсказка компилятору, что объект может быть изменен незамеченным для компилятора способом. Однако в случае локального указателя с последующим вызовом, компилятор гарантированно может быть уверен какое значение содержится в нем. Инлайн-вставка никак не противоречит стандарту.
|
|
|
|
|
Jul 11 2018, 10:24
|
Знающий
Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842
|
Цитата(aiwa @ Jul 11 2018, 13:01) Стандарт отдает работу с volatile на усмотрение компилятору. Приведенная строка говорит лишь о том что обращение к волайл объектам может отличаться от простого доступа на аппаратном уровне. И если бы вы прочитали следующую фразу то увидели бы что там дополнительно предупреждается что если будешь обращаться к волатайл объекту через указатель в котором этот волатайл открутили, то это ЮБ. А так все правила для волатайла которые записаны в стандарте должна выполнять любая реализация. Независимо от того как она их имплементирует.
|
|
|
|
|
Jul 11 2018, 10:30
|
Местный
Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682
|
Цитата(scifi @ Jul 11 2018, 13:20) Стандарт запрещает: "An object that has volatile-qualified type may be modified in ways unknown to the implementation". По-моему, это фразу нельзя толковать никак иначе. В английском не силен, правильно толковать не берусь, но, имхо, "мау be" - это предупреждение ни к чему строго не обязывающее.
|
|
|
|
|
Jul 11 2018, 10:34
|
Знающий
Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842
|
Цитата(scifi @ Jul 11 2018, 13:28) Значит ли это, что копирование волатайл объектов при помощи memcpy - это UB? Как страшно жЫть! Мы-то понимаем, что memcpy может читать и писать в произвольном порядке, и даже повторно. Но зачем пугать этими страшными буквами UB? Если вы пишете абсолютно переносимый код - да. Представьте что у вас регистровый файл с байтовым доступом на 32битной машине (да, извращение). Компилятор про это извращение знает и волатайл доступ делает правильно. А теперь представьте что вы делаете memcpy в этот регистровый файл. Стандарт такой, его задача формализовать язык которой возможно имплементировать на самой извращенской платформе, вкупе с максимальными возможностями для оптимизации. Хотя сейчас наметилась тенденция по вычищению самых упоротых ЮБ, но комитет как всегда быстр (чуть быстрее улитки).
|
|
|
|
|
Jul 11 2018, 10:35
|
Гуру
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136
|
Цитата(aiwa @ Jul 11 2018, 13:30) В английском не силен, правильно толковать не берусь, но, имхо, "мау be" - это предупреждение ни к чему строго не обязывающее. Там есть продолжение, которое именно обязывает: Цитата An object that has volatile-qualified type may be modified in ways unknown to the implementation or have other unknown side effects. Therefore any expression referring to such an object shall be evaluated strictly according to the rules of the abstract machine... "Shall" - это как раз "обязательно". Как Гэндальф со своим "you shall not pass"
|
|
|
|
|
Jul 12 2018, 10:01
|
Местный
Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682
|
Цитата(scifi @ Jul 11 2018, 13:20) Нет, не может. Стандарт запрещает: "An object that has volatile-qualified type may be modified in ways unknown to the implementation". По-моему, это фразу нельзя толковать никак иначе. Если компилятор на это забил - что же, можно подумать, мы не видели глючных компиляторов. А разве в таком случае компилятор к оператору ((void (*volatile)())func)(); не равным образом?
|
|
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|