Espacios de nombres
Variantes
Acciones

atributo de C++: assume

De cppreference.com
< cpp‎ | language‎ | attributes
 
 
 
 
 

Especifica que se supone que la expresión dada siempre se evalúa como true en un punto determinado. El comportamiento no está definido si la suposición no se cumple.

Contenido

[editar]Sintaxis

[[assume(expresión)]]
expresión - Una expresión contextually contextualmente convertida a bool donde la expresión debe evaluarse a true.

[editar]Explicación

La expresión expresión no puede ser una expresión operador coma, pero encerrar la expresión entre paréntesis permitirá que se use el operador coma.

La expresión expresión no se evalúa (pero aún así es potencialmente evaluada).

Solo se puede aplicar a una instrucción nula, como en [[assume(x >0)]];. Esta instrucción se denomina una suposición. Si la expresión no se evaluara como true en el lugar donde ocurre la suposición, el comportamiento no está definido. De lo contrario, la declaración no tiene efecto.

El propósito de una suposición es permitir optimizaciones del compilador basadas en la información proporcionada.

[editar]Notas

Dado que las suposiciones provocan un comportamiento no definido si no se cumplen, se deben utilizar con moderación.

Una forma correcta de utilizarlas es seguir las afirmaciones con suposiciones:

assert(x >0);// activa una aserción cuando NDEBUG no está definido y x > 0 es falso[[assume(x >0)]];// proporciona oportunidades de optimización cuando NDEBUG está definido

[editar]Ejemplo

#include <cmath>   void f(int& x, int y){void g(int);void h();   [[assume(x >0)]];// El compilador puede asumir que x es positiva   g(x /2);// Posiblemente se genere un código más eficiente   x =3;int z = x;   [[assume((h(), x == z))]];// El compilador puede asumir que x // tendría el mismo valor después de llamar a h// La suposición no ocasiona que se llame a h   h(); g(x);// El compilador puede reemplazar esto con g(3);   h(); g(x);// El compilador NO puede reemplazar esto con g(3);// Una suposición se aplica solo en el punto donde aparece   z = std::abs(y);   [[assume((g(z), true))]];// El compilador puede asumir que g(z) regresará   g(z);// Debido a las suposiciones anterior y siguiente,// el compilador puede reemplazar esto con g(10);   [[assume(y ==-10)]];// Comportamiento no definido si y != -10 en este punto   [[assume((x -1)*3==12)]];   g(x);// El compilador puede reemplazar esto con g(5);}

[editar]Referencias

  • El estándar C++23 (ISO/IEC 14882:2023):
  • 9.12.3 Atributo de suposición [dcl.attr.assume]

[editar]Véase también

Marca un punto de ejecución no alcanzable.
(función)[editar]

[editar]Enlaces externos

1. Documentación de extensiones de Clang al lenguaje: __builtin_assume.
2. Documentación de referencia de atributos de Clang: assume.
3. Documentación de MSVC: __assume built-in.
4. Documentación de GCC: __attribute__((assume(...))).
close