2010-06-05 9 views
8

По пятницам a specific problem, сам ответ и комментарии к нему, я хотел бы понять, если это правильное решение, обходное решение или взломать или просто неправильно.Строгое наложение указателя: есть доступ через «изменчивый» указатель/ссылку на решение?

В частности, я переписал код:

T x = ...; 
if (*reinterpret_cast <int*> (&x) == 0) 
    ... 

как:

T x = ...; 
if (*reinterpret_cast <volatile int*> (&x) == 0) 
    ... 

с volatile классификатором к указателю.

Предположим, что обработка T как int в моей ситуации имеет смысл. Получает ли этот доступ через ссылку volatile проблему сглаживания указателя?

Для справки, от спецификации:

[Примечание: летучее намек на реализацию, чтобы избежать агрессивной оптимизации с участием объекта, поскольку стоимость объекта может быть изменена при помощи определяется с помощью реализация. См. 1.9 для детальная семантика. В целом семантика летучий предназначены быть то же самое в C++, поскольку они находятся в С. - конец примечание]

EDIT:

Приведенный выше код сделал решить мою проблему, по крайней мере, на GCC 4.5 ,

+0

Этот вопрос ** не ** ясно C++ специфический. Стили в стиле C++ могут быть тривиально переписаны в C. – curiousguy

+0

@curiousguy C и C++ имеют разные языковые правила, однако –

+0

@MattMcNabb Как различаются WRT 'volatile'? – curiousguy

ответ

15

Летучие не могут помочь вам избежать неопределенного поведения здесь. Итак, если это сработает для вас с GCC, это удача.

Предположим, что T является POD. Тогда правильный способ сделать это

T x = …; 
int i; 
memcpy(&i,&x,sizeof i); 
if (i==0) 
    … 

Там! Нет строгой проблемы с псевдонимом и проблемы с выравниванием памяти. GCC даже обрабатывает memcpy как внутреннюю функцию (в этом случае никакой функциональный вызов не вставлен).

+1

«Летучие не могут помочь вам избежать неопределенного поведения здесь» - почему? У вас есть источник для этого заявления? – doublep

+5

Стандарт C++, раздел 3.10, пункт 15, - это место, которое вам нужно посмотреть в отношении строгого сглаживания. Нет упоминания об исключении, включающем волатильность. – sellibitze

+0

Бывают случаи, когда это не неопределенное поведение. Например, 'struct A {int a; }; int main() {X x; * reinterpret_cast (& x) = 10; } 'отлично и отлично определено в соответствии с' 9.2/17'. Объект имеет тип 'int', а lvalue также имеет тип' volatile int', поэтому сглаживание идет хорошо. –

-3

Volatile не может помочь вам избежать неопределенного поведения здесь.

Ну, что-нибудь относительно volatile несколько неясно в стандарте. Я в основном согласился с вашим ответом, но теперь я хотел бы немного не согласиться.

Для того, чтобы понять, что означает volatile, стандарт не ясен для большинства людей, особенно для некоторых авторов компилятора. Лучше подумать: при использовании volatile (и только когда), C ​​/ C++ довольно высокий уровень сборки.

При записи на volatile lvalue компилятор выдаст МАГАЗИН или несколько МАГАЗИНОВ, если их недостаточно (volatile не означает атомный).

При записи на volatile lvalue компилятор выдаст LOAD или несколько LOAD, если этого недостаточно.

Конечно, там, где нет явного НАГРУЗКИ или МАГАЗИНА, компилятор просто выдаст инструкции, которые означают LOAD или STORE.

sellibitze дал наилучшее решение: использовать memcpy для повторных интерпретаций бит.

Но если все доступы к области памяти выполняются с volatile lvalues, совершенно ясно, что строгие правила наложения спектров не применяются. Это ответ на ваш вопрос.

+0

Почему downvote? – curiousguy

+6

-1: Во-первых, это не форум; мы не рассматриваем другие ответы в ответах. Если вы считаете, что у вас есть лучший ответ, напишите ответ, который задает вопрос. Во-вторых, что более важно, «что-то, что касается летучих, в стандарте несколько нечеткое». Нет, это не так. В стандарте четко указывается, насколько изменчивы и нестабильны работы в отношении абстрактной машины. –

+1

@NicolBolas "_Всегда, и что еще более важно," что-либо касающееся изменчивости в стандарте несколько нечеткое ". Нет, это не так.« Многие считают, что это очень неясно. Если вы считаете, что это понятно, объясните, что это значит, и моя интерпретация верна. – curiousguy

 Смежные вопросы

  • Нет связанных вопросов^_^