немного странный код C++

Я думаю, что Вы могли бы быть немного смущены. CSS является методом моделирования документов HTML, является ли это элементом таблицы или 'отделением'

, Это раньше было, что таблицы использовались в HTML для разработки целого макета страницы. Было распространено видеть несколько вложенных таблиц (обычно сгенерированный программами WYSIWYG, такими как DreamWeaver), и этот вывод к maintainance кошмару.

Начиная с введения и внедрения таблиц стилей CSS это теперь корректно только для использования таблицы для табличных данных. Это означает, представляются ли Ваши данные наиболее естественно как использование таблицы элемент таблицы. Можно все еще разработать таблицу с помощью CSS.

Однако и я обычно отношусь неодобрительно к этому методу, так как он копирует существующую функциональность, возможно использовать элементы для создания таблицы как структура. На самом деле существует несколько веб-сайтов, которые генерируют такой код для Вас, но у меня нет ссылок на руку.

Remeber также, что некоторые пользователи могли бы или просматривать в тексте только режим или использовать программу экранного доступа, оба из которых, вероятно, повредят страницу (как чтение столбцов вертикально, а не горизонтально) следовательно надлежащее использование таблиц.

HTH

6
задан recursion.ninja 7 July 2015 в 21:58
поделиться

4 ответа

Это довольно распространенная идиома во встроенном программировании (хотя она должна быть инкапсулирована в набор функций или макросов), где требуется доступ к регистру устройства. Во многих архитектурах регистры устройства отображаются на адрес памяти и доступны как любая другая переменная (хотя и по фиксированному адресу - могут использоваться либо указатели, либо компоновщик или расширение компилятора могут помочь с исправлением адреса). Однако, если компилятор C не видит побочного эффекта для доступа к переменной, он может оптимизировать его, если только переменная (или указатель, используемый для доступа к переменной) не помечена как изменчивая.

Итак, выражение;

*(volatile UINT16 *)&someVar->something;

] выполнит 16-битное чтение с некоторым смещением (предоставленным смещением элемента структуры something ) от адреса, хранящегося в указателе someVar . Это чтение произойдет и не может быть оптимизировано компилятором из-за ключевого слова volatile .

Обратите внимание, что некоторые регистры устройства выполняют некоторые функции, даже если они просто считываются - даже если считанные данные не иначе используется. Это довольно часто встречается с регистрами состояния, где состояние ошибки может быть устранено после чтения регистра, который указывает состояние ошибки в конкретном бите.

Это, вероятно, одна из наиболее распространенных причин использования ] volatile ключевое слово.

19
ответ дан 8 December 2019 в 02:30
поделиться

Я думаю, что автор хотел заставить компилятор выдавать барьеров памяти в этих точках. Оценивая результат выражения volatile , компилятор указывает на то, что это выражение не должно быть оптимизировано и должно «создавать экземпляр» семантики доступа к изменчивому местоположению (барьеры памяти, ограничения на оптимизацию) ) в каждой строке, где встречается эта идиома.

Этот тип идиомы может быть «инкапсулирован» в макрос препроцессора ( #define ) в случае, если другой компилятор имеет другой способ вызвать тот же эффект . Например, компилятор с возможностью напрямую кодировать барьеры для чтения или записи памяти может использовать встроенный механизм, а не эту идиому.

9
ответ дан 8 December 2019 в 02:30
поделиться

Обычно это плохой код.

В C и C ++ volatile означает очень мало и не обеспечивает неявный барьер памяти. Итак, этот код совершенно неправильный, если только он не записан как

memory_barrier();
*(volatile UINT16 *)&someVar->something;

. Это просто плохой код.

Expenation: volatile не делает переменную атомарной!

Reed this article: http : //www.mjmwired.net/kernel/Documentation/volatile-considered-harmful.txt

Вот почему volatile почти никогда не следует использовать в правильном коде.

-1
ответ дан 8 December 2019 в 02:30
поделиться

Итак, вот общий план.

Если этот адрес указывает на отображаемую в память область на ПЛИС или другом устройстве, тогда устройство может действительно что-то делать, когда вы читаете этот адрес.

9
ответ дан 8 December 2019 в 02:30
поделиться