В этом конкретном примере компилятор может видеть, что ни один из выходов asm (т.е. p
) не используется. Поскольку asm не является изменчивым (и имеет как минимум 1 вывод), компилятор может полностью отказаться от оператора во время оптимизации.
Возможно, стоит упомянуть, что на i386 все расширенные операторы asm (т.е. с параметрами) всегда неявно clobber fpsr (флаги с плавающей запятой) и eflags (думаю: cc
clobber). Если оператор не полностью отбрасывается (например, если он нестабилен), это может привести к ошибке . Если это так, то в худшем случае будет крошечный потери эффективности, а не неправильных результатов.
Так, чтобы подвести итог:
- Да, это законно.
- Нет, он не вводит неопределенное поведение. ЗА ИСКЛЮЧЕНИЕМ, что значение
p
может быть неопределенным, так как вы говорите, что переписываете содержимое, но вы на самом деле ничего не вкладываете в него.
- Это может теоретически ввести крошечную неэффективность, но, вероятно, этого не произойдет.
Поскольку вы предоставили выход, но результат не используется, компилятор (предполагающий совместимость с gcc) может свободно исключать выражение asm. –
Это нормально, но чего вы надеетесь достичь? Один общий пустой asm - asm ("": "+ m" (f)) для принудительного округления поплавка f на x87. –
Да, это все еще хорошо. Как я сказал ниже, использование расширенного asm может (возможно) ввести незначительную неэффективность, но это не приведет к неправильному коду. Если вам действительно неудобно оставлять этот пробел, вы всегда можете добавить комментарий ('' # no code here today! "'). –