реклама на сайте
подробности

 
 
6 страниц V  « < 4 5 6  
Reply to this topicStart new topic
> Инлайновая функция
aiwa
сообщение Jul 11 2018, 10:01
Сообщение #76


Местный
***

Группа: Участник
Сообщений: 281
Регистрация: 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
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 11 2018, 10:03
Сообщение #77


Гуру
******

Группа: Свой
Сообщений: 2 963
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(aiwa @ Jul 11 2018, 13:01) *
Стандарт отдает работу с volatile на усмотрение компилятору.

Нет, не отдаёт. И вот эта цитата из стандарта - это вовсе не про то.
Go to the top of the page
 
+Quote Post
aiwa
сообщение Jul 11 2018, 10:17
Сообщение #78


Местный
***

Группа: Участник
Сообщений: 281
Регистрация: 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.

Что это всего лишь подсказка компилятору, что объект может быть изменен незамеченным для компилятора способом.
Однако в случае локального указателя с последующим вызовом, компилятор гарантированно может быть уверен какое значение содержится в нем.
Инлайн-вставка никак не противоречит стандарту.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 11 2018, 10:20
Сообщение #79


Гуру
******

Группа: Свой
Сообщений: 2 963
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(aiwa @ Jul 11 2018, 13:17) *
Однако в случае локального указателя с последующим вызовом, компилятор гарантированно может быть уверен какое значение содержится в нем.

Нет, не может. Стандарт запрещает: "An object that has volatile-qualified type may be modified in ways unknown to the implementation". По-моему, это фразу нельзя толковать никак иначе. Если компилятор на это забил - что же, можно подумать, мы не видели глючных компиляторов.
Кстати, я цитирую C99. Вы цитируете C++. Там есть некоторая разница. Сам предпочитаю в C++ не вникать, да и не использую я его.
Go to the top of the page
 
+Quote Post
Kabdim
сообщение Jul 11 2018, 10:24
Сообщение #80


Знающий
****

Группа: Свой
Сообщений: 513
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



Цитата(aiwa @ Jul 11 2018, 13:01) *
Стандарт отдает работу с volatile на усмотрение компилятору.

Приведенная строка говорит лишь о том что обращение к волайл объектам может отличаться от простого доступа на аппаратном уровне. И если бы вы прочитали следующую фразу то увидели бы что там дополнительно предупреждается что если будешь обращаться к волатайл объекту через указатель в котором этот волатайл открутили, то это ЮБ.

А так все правила для волатайла которые записаны в стандарте должна выполнять любая реализация. Независимо от того как она их имплементирует.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 11 2018, 10:28
Сообщение #81


Гуру
******

Группа: Свой
Сообщений: 2 963
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Kabdim @ Jul 11 2018, 13:24) *
предупреждается что если будешь обращаться к волатайл объекту через указатель в котором этот волатайл открутили, то это ЮБ.

Значит ли это, что копирование волатайл объектов при помощи memcpy - это UB? Как страшно жЫть!
Мы-то понимаем, что memcpy может читать и писать в произвольном порядке, и даже повторно. Но зачем пугать этими страшными буквами UB?
Go to the top of the page
 
+Quote Post
aiwa
сообщение Jul 11 2018, 10:30
Сообщение #82


Местный
***

Группа: Участник
Сообщений: 281
Регистрация: 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" - это предупреждение ни к чему строго не обязывающее.
Go to the top of the page
 
+Quote Post
Kabdim
сообщение Jul 11 2018, 10:34
Сообщение #83


Знающий
****

Группа: Свой
Сообщений: 513
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



Цитата(scifi @ Jul 11 2018, 13:28) *
Значит ли это, что копирование волатайл объектов при помощи memcpy - это UB? Как страшно жЫть!
Мы-то понимаем, что memcpy может читать и писать в произвольном порядке, и даже повторно. Но зачем пугать этими страшными буквами UB?

Если вы пишете абсолютно переносимый код - да. Представьте что у вас регистровый файл с байтовым доступом на 32битной машине (да, извращение). Компилятор про это извращение знает и волатайл доступ делает правильно. А теперь представьте что вы делаете memcpy в этот регистровый файл.
Стандарт такой, его задача формализовать язык которой возможно имплементировать на самой извращенской платформе, вкупе с максимальными возможностями для оптимизации.
Хотя сейчас наметилась тенденция по вычищению самых упоротых ЮБ, но комитет как всегда быстр (чуть быстрее улитки).
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 11 2018, 10:35
Сообщение #84


Гуру
******

Группа: Свой
Сообщений: 2 963
Регистрация: 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" biggrin.gif
Go to the top of the page
 
+Quote Post
Kabdim
сообщение Jul 11 2018, 10:50
Сообщение #85


Знающий
****

Группа: Свой
Сообщений: 513
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



Кстати с волатайл буферами (если не хочется быть платформозависимым) стоит использовать std::copy, который вроде как правильно воспринимает волатайл. Но сам указатель-итератор не должен быть выхолощен от волатайл-квалификатора.
Go to the top of the page
 
+Quote Post
aiwa
сообщение Jul 12 2018, 10:01
Сообщение #86


Местный
***

Группа: Участник
Сообщений: 281
Регистрация: 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)(); не равным образом?
Go to the top of the page
 
+Quote Post

6 страниц V  « < 4 5 6
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2018 - 05:33
Рейтинг@Mail.ru


Страница сгенерированна за 0.01105 секунд с 7
ELECTRONIX ©2004-2016