+ All Categories
Home > Documents > C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big...

C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big...

Date post: 15-Jul-2020
Category:
Upload: others
View: 2 times
Download: 0 times
Share this document with a friend
163
C++17 C++17 The next generation J. Daniel Garcia Grupo ARCOS Universidad Carlos III de Madrid Noviembre 2017 cbed J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 1/126
Transcript
Page 1: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

C++17The next generation

J. Daniel Garcia

Grupo ARCOSUniversidad Carlos III de Madrid

Noviembre 2017

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 1/126

Page 2: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Aviso

c Esta obra está bajo una Licencia Creative CommonsAtribución-NoComercial-SinDerivar 4.0 Internacional.

b Debes dar crédito en la obra en la forma especificadapor el autor o licenciante.

e El licenciante permite copiar, distribuir y comunicar pú-blicamente la obra. A cambio, esta obra no puede serutilizada con fines comerciales — a menos que se ob-tenga el permiso expreso del licenciante.

d El licenciante permite copiar, distribuir, transmitir y co-municar públicamente solamente copias inalteradas dela obra – no obras derivadas basadas en ella.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 2/126

Page 3: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

ARCOS@uc3m

ARCOS: Investigación aplicada.Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos deprogramación para la mejora de aplicaciones.

Mejora de aplicaciones:REPARA: Reengineering and Enabling Performance andpoweR of Applications. Financiado por Comisión Europea(FP7). 2013–2016RePhrase: REfactoring Parallel Heterogeneous ResourceAware Applications. Financiado por Comisión Europea(H2020). 2015–2018

Normalización:ISO/IEC JTC/SC22/WG21. ISO C++ standards committe.

C++11, C++14, C++17, C++20, . . .

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 3/126

Page 4: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

C++ un lenguaje en evolución

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 4/126

Page 5: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Evolución

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 5/126

Page 6: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

C++14

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 6/126

Page 7: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

C++17

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 7/126

Page 8: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Pequeños cambios

1 Pequeños cambios

2 Aclaraciones

3 Programación genérica

4 Atributos

5 Simplificaciones

6 Algoritmos paralelos

7 Acceso al sistema de ficheros

8 Nuevos tipos en la bibliotecacbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 8/126

Page 9: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Pequeños cambios

Trigrafos

1 Pequeños cambiosTrigrafosKeyword registerIncremento de booleanosEspecificaciones dinámicas de excepcionesClase auto_ptrReglas para iniciaciónstatic_assert

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 9/126

Page 10: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Pequeños cambios

Trigrafos

Adios a los trigrafos

Un trigrafo es una secuencia de caracteres que permitesimular otro carácter.

Ejemplos:??= ⇒ #.??- ⇒ ˜.. . .

En C++17 los trigrafos dejan de ser estándar.Limitada utilidad hoy en día.Simplifica el análisis de código.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 10/126

Page 11: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Pequeños cambios

Trigrafos

Adios a los trigrafos

Un trigrafo es una secuencia de caracteres que permitesimular otro carácter.

Ejemplos:??= ⇒ #.??- ⇒ ˜.. . .

En C++17 los trigrafos dejan de ser estándar.Limitada utilidad hoy en día.Simplifica el análisis de código.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 10/126

Page 12: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Pequeños cambios

Keyword register

1 Pequeños cambiosTrigrafosKeyword registerIncremento de booleanosEspecificaciones dinámicas de excepcionesClase auto_ptrReglas para iniciaciónstatic_assert

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 11/126

Page 13: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Pequeños cambios

Keyword register

¡Hasta luego register!

La palabra reservada register está despreciada desdeC++11.

Uso legado de register

for (register int i=0; i<10; ++i) {v[ i ] = w[i ];

}

Eliminado en C++17.

La palabra register se mantiene reservada para usofuturo.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 12/126

Page 14: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Pequeños cambios

Incremento de booleanos

1 Pequeños cambiosTrigrafosKeyword registerIncremento de booleanosEspecificaciones dinámicas de excepcionesClase auto_ptrReglas para iniciaciónstatic_assert

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 13/126

Page 15: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Pequeños cambios

Incremento de booleanos

Eliminando operator++(bool)

El operador ++ sobre valores bool ha estadodespreciado desde C++98.

Usando el operador ++

bool x = false;x++; // x == truex++; // x == trueif (x++) do_whatever();if (std :: exchange(x,true)) do_whatever();

Se elimina de C++17

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 14/126

Page 16: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Pequeños cambios

Especificaciones dinámicas de excepciones

1 Pequeños cambiosTrigrafosKeyword registerIncremento de booleanosEspecificaciones dinámicas de excepcionesClase auto_ptrReglas para iniciaciónstatic_assert

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 15/126

Page 17: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Pequeños cambios

Especificaciones dinámicas de excepciones

Especifando excepciones

Las especificaciones dinámicas de excepciones estándespreciadas desde C++11.

Especificaciones de excepciones

void f () throw (std:: logic_error ) ;void g() throw();

Se eliminan en C++17

Especificaciones de excepciones

void f () ;void g() noexcept;

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 16/126

Page 18: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Pequeños cambios

Especificaciones dinámicas de excepciones

Especifando excepciones

Las especificaciones dinámicas de excepciones estándespreciadas desde C++11.

Especificaciones de excepciones

void f () throw (std:: logic_error ) ;void g() throw();

Se eliminan en C++17

Especificaciones de excepciones

void f () ;void g() noexcept;

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 16/126

Page 19: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Pequeños cambios

Clase auto_ptr

1 Pequeños cambiosTrigrafosKeyword registerIncremento de booleanosEspecificaciones dinámicas de excepcionesClase auto_ptrReglas para iniciaciónstatic_assert

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 17/126

Page 20: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Pequeños cambios

Clase auto_ptr

Punteros inteligentes

C++11 incorporó nuevos punteros inteligentes:unique_ptr.shared_ptr.weak_ptr.

C++11 despreció un puntero inteligente:auto_ptr.

C++17 elimina auto_ptr.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 18/126

Page 21: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Pequeños cambios

Clase auto_ptr

Punteros inteligentes

C++11 incorporó nuevos punteros inteligentes:unique_ptr.shared_ptr.weak_ptr.

C++11 despreció un puntero inteligente:auto_ptr.

C++17 elimina auto_ptr.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 18/126

Page 22: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Pequeños cambios

Reglas para iniciación

1 Pequeños cambiosTrigrafosKeyword registerIncremento de booleanosEspecificaciones dinámicas de excepcionesClase auto_ptrReglas para iniciaciónstatic_assert

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 19/126

Page 23: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Pequeños cambios

Reglas para iniciación

Iniciación de lista

C++11 introdujo la iniciación a partir de llaves.Podía ser de dos tipos:

Iniciación de copia:

T x = {a, b, c }; // T es initializer_list <decltype(a)>U y = {a}; // U es initializer_list <decltype(a)>

Iniciación directa:

T x {a, b, c }; // T es initializer_list <decltype(a)>U y {a}; // U es initializer_list <decltype(a)>, pero confuso

C++17 resuelve la confusiónT x {a, b, c }; // T es initializer_list <decltype(a)>U y {a}; // U es decltype(a)

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 20/126

Page 24: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Pequeños cambios

Reglas para iniciación

Iniciación de lista

C++11 introdujo la iniciación a partir de llaves.Podía ser de dos tipos:

Iniciación de copia:

T x = {a, b, c }; // T es initializer_list <decltype(a)>U y = {a}; // U es initializer_list <decltype(a)>

Iniciación directa:

T x {a, b, c }; // T es initializer_list <decltype(a)>U y {a}; // U es initializer_list <decltype(a)>, pero confuso

C++17 resuelve la confusiónT x {a, b, c }; // T es initializer_list <decltype(a)>U y {a}; // U es decltype(a)

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 20/126

Page 25: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Pequeños cambios

static_assert

1 Pequeños cambiosTrigrafosKeyword registerIncremento de booleanosEspecificaciones dinámicas de excepcionesClase auto_ptrReglas para iniciaciónstatic_assert

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 21/126

Page 26: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Pequeños cambios

static_assert

Aserciones en tiempo de compiación

C++11 introdujo las aserciones en tiempo de compilación.template <typename T>void f (T & x) {

static_assert (std :: is_integral_v<T>,"T debe ser un tipo numérico integral" ) ;

// ...}

void g() {f (5) ; // OKf (1.0) ; // Error de compilación// ...

}

C++17 hace el mensaje opcional.En muchos casos el mensaje por defecto es suficiente.Evita tener que replicar el texto dos veces.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 22/126

Page 27: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Pequeños cambios

static_assert

Aserciones en tiempo de compiación

C++11 introdujo las aserciones en tiempo de compilación.template <typename T>void f (T & x) {

static_assert (std :: is_integral_v<T>,"T debe ser un tipo numérico integral" ) ;

// ...}

void g() {f (5) ; // OKf (1.0) ; // Error de compilación// ...

}

C++17 hace el mensaje opcional.En muchos casos el mensaje por defecto es suficiente.Evita tener que replicar el texto dos veces.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 22/126

Page 28: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Aclaraciones

1 Pequeños cambios

2 Aclaraciones

3 Programación genérica

4 Atributos

5 Simplificaciones

6 Algoritmos paralelos

7 Acceso al sistema de ficheros

8 Nuevos tipos en la bibliotecacbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 23/126

Page 29: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Aclaraciones

Orden de evaluación

2 AclaracionesOrden de evaluaciónElusión de copiaExcepciones y punteros a funciónMemoria dinámica sobre-alineada

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 24/126

Page 30: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Aclaraciones

Orden de evaluación

Orden de evaluación

Orden de evaluación de operandos en C++11:void f () {

std :: string s = "but I have heard it works even if you don’t believe in it " ;s.replace(0, 4, "" ) .replace(s. find ("even"), 4, "only") .replace(

s. find (" don’t" ) , 6, "" ) ;assert(s == "I have heard it works only if you believe in it " ) ;// ...

}

Problema:Encadenamiento de llamadas a funciones miembro.Orden ejecución no definido en C++11.Error en “The C++ Programming Language. 4 Ed.”.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 25/126

Page 31: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Aclaraciones

Orden de evaluación

Orden de evaluación

Orden de evaluación de operandos en C++11:void f () {

std :: string s = "but I have heard it works even if you don’t believe in it " ;s.replace(0, 4, "" ) .replace(s. find ("even"), 4, "only") .replace(

s. find (" don’t" ) , 6, "" ) ;assert(s == "I have heard it works only if you believe in it " ) ;// ...

}

Problema:Encadenamiento de llamadas a funciones miembro.Orden ejecución no definido en C++11.Error en “The C++ Programming Language. 4 Ed.”.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 25/126

Page 32: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Aclaraciones

Orden de evaluación

Orden de evaluación

Otro ejemplo en C++11:void f () {

std :: map<int,int> v;v[0] = v.size () ;// ...

}

Resultado:{0,0}.{0,1}.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 26/126

Page 33: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Aclaraciones

Orden de evaluación

Fijando el orden en C++17

Se fija el orden de evaluación en:a.ba->ba->*ba(b1,b2,b3)b op= aa[b]a « ba » b

Pero:No se define el orden de evaluación de argumentos defunción.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 27/126

Page 34: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Aclaraciones

Orden de evaluación

Fijando el orden en C++17

Se fija el orden de evaluación en:a.ba->ba->*ba(b1,b2,b3)b op= aa[b]a « ba » b

Pero:No se define el orden de evaluación de argumentos defunción.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 27/126

Page 35: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Aclaraciones

Elusión de copia

2 AclaracionesOrden de evaluaciónElusión de copiaExcepciones y punteros a funciónMemoria dinámica sobre-alineada

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 28/126

Page 36: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Aclaraciones

Elusión de copia

Eludiendo copias temporales

El estándar permite evitar copias intermedias en algunsocasos:

Cuando se inicia un objeto con otro objeto temporal.Cuando se devuelve una variable local.Cuando se captura una excepción por valor.

Pero:Es una optimización opcional.Hace falta definir constructores de copia por si elcompilador no optimiza.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 29/126

Page 37: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Aclaraciones

Elusión de copia

Eludiendo copias temporales

El estándar permite evitar copias intermedias en algunsocasos:

Cuando se inicia un objeto con otro objeto temporal.Cuando se devuelve una variable local.Cuando se captura una excepción por valor.

Pero:Es una optimización opcional.Hace falta definir constructores de copia por si elcompilador no optimiza.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 29/126

Page 38: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Aclaraciones

Elusión de copia

Ejemplo de elusión

class X {public:

X(int n);X(const X &) = delete;X(X &&) = delete;// ...

};

X make_x(int z) { return X{z}; }

void f () {auto a = make_x(10); // Sin copias

}

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 30/126

Page 39: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Aclaraciones

Excepciones y punteros a función

2 AclaracionesOrden de evaluaciónElusión de copiaExcepciones y punteros a funciónMemoria dinámica sobre-alineada

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 31/126

Page 40: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Aclaraciones

Excepciones y punteros a función

Especificaciones de excepción

Las especificaciones de excepciones pasana a formarparte del tipo de la función.

// p1_t y p2_t son dos tipos distintosusing p1_t = int(∗) (char) noexcept;using p2_t = int(∗) (char);

Se puede convertir un valor de tipo puntero a excepciónnoexcept, a un tipo punter a excepción.

int f (char);int g(char) noexcept;// ...p1_t p1f = f ; // Errorp1_t p1g = g; // OKp2_t p2f = f ; // OKp2_t p2g = g; // Conversión

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 32/126

Page 41: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Aclaraciones

Excepciones y punteros a función

Especificaciones de excepción

Las especificaciones de excepciones pasana a formarparte del tipo de la función.

// p1_t y p2_t son dos tipos distintosusing p1_t = int(∗) (char) noexcept;using p2_t = int(∗) (char);

Se puede convertir un valor de tipo puntero a excepciónnoexcept, a un tipo punter a excepción.

int f (char);int g(char) noexcept;// ...p1_t p1f = f ; // Errorp1_t p1g = g; // OKp2_t p2f = f ; // OKp2_t p2g = g; // Conversión

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 32/126

Page 42: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Aclaraciones

Memoria dinámica sobre-alineada

2 AclaracionesOrden de evaluaciónElusión de copiaExcepciones y punteros a funciónMemoria dinámica sobre-alineada

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 33/126

Page 43: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Aclaraciones

Memoria dinámica sobre-alineada

new y alineamiento

En C++11/14 no hay garantías de alineamiento con new.struct alignas(16) vec {

float val [4];};

float ∗ v = new vec[100];

C++17 tiene en cuenta el alineamiento.void∗ operator new(size_t, align_val_t);void∗ operator new[](size_t, align_val_t ) ;void operator delete(void∗, align_val_t);void operator delete[](void∗, align_val_t ) ;void operator delete(void∗, size_t, align_val_t ) ;void operator delete[](void∗, size_t , align_val_t ) ;

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 34/126

Page 44: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Aclaraciones

Memoria dinámica sobre-alineada

new y alineamiento

En C++11/14 no hay garantías de alineamiento con new.struct alignas(16) vec {

float val [4];};

float ∗ v = new vec[100];

C++17 tiene en cuenta el alineamiento.void∗ operator new(size_t, align_val_t);void∗ operator new[](size_t, align_val_t ) ;void operator delete(void∗, align_val_t);void operator delete[](void∗, align_val_t ) ;void operator delete(void∗, size_t, align_val_t ) ;void operator delete[](void∗, size_t , align_val_t ) ;

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 34/126

Page 45: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Programación genérica

1 Pequeños cambios

2 Aclaraciones

3 Programación genérica

4 Atributos

5 Simplificaciones

6 Algoritmos paralelos

7 Acceso al sistema de ficheros

8 Nuevos tipos en la bibliotecacbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 35/126

Page 46: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Programación genérica

Deducción de argumentos de plantilla de clase

3 Programación genéricaDeducción de argumentos de plantilla de claseDeducción de valores en plantillasPlegamiento de expresionesif en tiempo de compilaciónOtros cambios en programación genérica

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 36/126

Page 47: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Programación genérica

Deducción de argumentos de plantilla de clase

Deducción de argumentos de función

En C++ siempre se deducen argumentos de plantillaimplícitamente.template <typename T>void f (T & x);

void g() {f (2) ; // f<int>(2)f (1.0) ; // f<double>(1.0)

complex<float> z;f (z) ; // f<complex<float>>(z);

vector<map<int,string>> v;f (v) ; // f<vector<map<int,string>>>

}

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 37/126

Page 48: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Programación genérica

Deducción de argumentos de plantilla de clase

Deduccion de argumentos de clase

Sin embargo, para clases . . .void g() {

std :: pair<int, string> p{1969, "Daniel" };

auto q = std :: make_pair(1950, "Bjarne");

std :: pair r{1955, "James"}; // Error faltan argumentos de plantilla}

No se pueden deducir los argumentos de plantilla enconstructor.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 38/126

Page 49: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Programación genérica

Deducción de argumentos de plantilla de clase

Deducción de argumentos

En C++17 se pueden deducir los argumentos de plantillade clase.std :: pair p{1969, "Daniel"s}; // std :: pair<int ,std :: string>

std :: map<int,double> create_dic();// std :: tuple<int , double, std :: map<int,double>>std :: tuple q{1, 2.5, create_dic() };

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 39/126

Page 50: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Programación genérica

Deducción de argumentos de plantilla de clase

Simplificación de código

Sin deducción:std :: mutex m1;std :: recursive_mutex m2;std :: shared_lock<std::recursive_mutex> sl{m2};std :: lock_guard<std::mutex, std::shared_lock<std::recursive_mutex>> l{m1,s1};

Con deducción en C++17:std :: mutex m1;std :: recursive_mutex m2;std :: shared_lock sl{m2};std :: lock_guard l{m1,s1};

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 40/126

Page 51: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Programación genérica

Deducción de argumentos de plantilla de clase

Simplificación de código

Sin deducción:std :: mutex m1;std :: recursive_mutex m2;std :: shared_lock<std::recursive_mutex> sl{m2};std :: lock_guard<std::mutex, std::shared_lock<std::recursive_mutex>> l{m1,s1};

Con deducción en C++17:std :: mutex m1;std :: recursive_mutex m2;std :: shared_lock sl{m2};std :: lock_guard l{m1,s1};

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 40/126

Page 52: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Programación genérica

Deducción de valores en plantillas

3 Programación genéricaDeducción de argumentos de plantilla de claseDeducción de valores en plantillasPlegamiento de expresionesif en tiempo de compilaciónOtros cambios en programación genérica

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 41/126

Page 53: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Programación genérica

Deducción de valores en plantillas

Valores como argumentos de plantilla

Un argumento de plantilla puede ser un valor.template <int n>class table;

table<10> t1; // n==10table<100> t2; // n==100

Se puede generalizar el tipo del valortemplate <typename T, T n>class table;

table<10> t1; // table<int,10>table<100UL> t2; // table<unsigned long, 100UL>

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 42/126

Page 54: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Programación genérica

Deducción de valores en plantillas

Valores como argumentos de plantilla

Un argumento de plantilla puede ser un valor.template <int n>class table;

table<10> t1; // n==10table<100> t2; // n==100

Se puede generalizar el tipo del valortemplate <typename T, T n>class table;

table<10> t1; // table<int,10>table<100UL> t2; // table<unsigned long, 100UL>

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 42/126

Page 55: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Programación genérica

Deducción de valores en plantillas

Simplificando argumentos valor

Se puede usar auto:template <auto n>class table;

table<10> t1; // decltype(n)=int , n=10table<100UL> t2; // decletype(n)=unsigned long, n=100UL

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 43/126

Page 56: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Programación genérica

Plegamiento de expresiones

3 Programación genéricaDeducción de argumentos de plantilla de claseDeducción de valores en plantillasPlegamiento de expresionesif en tiempo de compilaciónOtros cambios en programación genérica

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 44/126

Page 57: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Programación genérica

Plegamiento de expresiones

Sumando varios valores

Una función genérica de suma:auto suma() { return 0; }

template <typename T1>auto suma(T1 v1) { return v1; }

template <typename T1, typename T2>auto suma(T1 v1, T2 v2) { return v1+v2; }

template <typename T1, typename T2, typename T3>auto suma(T1 v1, T2 v2, T3 v3) { return v1+v2+v3; }

// ...

void f () {auto x = suma(1, 2.0);auto y = suma(1L, 1.5f, 2LL);// ...

}cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 45/126

Page 58: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Programación genérica

Plegamiento de expresiones

Suma variádica

Una función genérica de suma en C++11:auto suma() { return 0; }

template <typename T1, typename ... Ts>auto suma(T1 x1, Ts ... xs) {

return x1 + suma(xs...);}

void f () {auto x = suma(1, 2.0);auto y = suma(1L, 1.5f, 2LL);// ...

}

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 46/126

Page 59: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Programación genérica

Plegamiento de expresiones

Plegando expresiones

En C++17 se puede aplicar plegamiento para algunosoperadores.template <typename ... Ts>auto suma(Ts ... xs) { return (xs + ... + 0); }

o bien:template <typename ... Ts>auto suma(Ts ... xs) { return (... + xs); }

Expresiones válidas:(...⊗ args) → (. . . ((a1 ⊗ a2)⊗ a3)⊗ . . .)⊗ an(x ⊗ ...⊗ args) → (. . . ((x ⊗ a1)⊗ a2)⊗ . . .)⊗ an(args ⊗ ...) → a1 ⊗ (. . .⊗ (an−1 ⊗ an))(args ⊗ ...⊗ x) → a1 ⊗ (. . .⊗ (an−1 ⊗ (an ⊗ x)))

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 47/126

Page 60: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Programación genérica

Plegamiento de expresiones

Plegando expresiones

En C++17 se puede aplicar plegamiento para algunosoperadores.template <typename ... Ts>auto suma(Ts ... xs) { return (xs + ... + 0); }

o bien:template <typename ... Ts>auto suma(Ts ... xs) { return (... + xs); }

Expresiones válidas:(...⊗ args) → (. . . ((a1 ⊗ a2)⊗ a3)⊗ . . .)⊗ an(x ⊗ ...⊗ args) → (. . . ((x ⊗ a1)⊗ a2)⊗ . . .)⊗ an(args ⊗ ...) → a1 ⊗ (. . .⊗ (an−1 ⊗ an))(args ⊗ ...⊗ x) → a1 ⊗ (. . .⊗ (an−1 ⊗ (an ⊗ x)))

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 47/126

Page 61: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Programación genérica

if en tiempo de compilación

3 Programación genéricaDeducción de argumentos de plantilla de claseDeducción de valores en plantillasPlegamiento de expresionesif en tiempo de compilaciónOtros cambios en programación genérica

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 48/126

Page 62: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Programación genérica

if en tiempo de compilación

SFINAE

Dos versiones de una función con SFINAE.template <typename T,

std :: enable_if_t<std :: is_pointer<T>::value> ∗ = nullptr >auto get(T v) { return ∗v; }

template <typename T,std :: enable_if_t<!std :: is_pointer<T>::value> ∗ = nullptr >

auto get(T v) { return v; }

void f () {int x;int ∗ p = x;

auto z1 = get(x) ;auto z2 = get(p);

}

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 49/126

Page 63: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Programación genérica

if en tiempo de compilación

Tag dispatching

Dos versiones con tag dispatching.template <typename T>auto get(T v, std :: true_type) { return ∗ v; }

template <typename T>auto get(T v, std :: false_type) { return v; }

template <typename T>auto get(T v) { return get( t , std :: is_pointer<T>::value); }

void f () {int x;int ∗ p = x;

auto z1 = get(x) ;auto z2 = get(p);

}

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 50/126

Page 64: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Programación genérica

if en tiempo de compilación

Selección en tiempo de compilación

Se pueden usar sentencias if que se evalúan en tiempode compilación.template <typename T>auto get(T v) {

if constexpr (std :: is_pointer_v<T>) { return ∗v; }else { return v; }

}

void f () {int x;int ∗ p = x;

auto z1 = get(x) ;auto z2 = get(p);

}

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 51/126

Page 65: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Programación genérica

Otros cambios en programación genérica

3 Programación genéricaDeducción de argumentos de plantilla de claseDeducción de valores en plantillasPlegamiento de expresionesif en tiempo de compilaciónOtros cambios en programación genérica

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 52/126

Page 66: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Programación genérica

Otros cambios en programación genérica

Más sobre plantillas

Uso de typename en vez de class en parámetrosplantilla de plantilla (template template parameters).Mejora de compatibilidad plantilla de plantillas conparámetros por defecto.Menos restricciones para parámetros de plantilla que noson tipos.

Punteros, referencias, y punteros a miembro.

Posibilidad de definir expresiones lambda que sonconstexpr.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 53/126

Page 67: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Atributos

1 Pequeños cambios

2 Aclaraciones

3 Programación genérica

4 Atributos

5 Simplificaciones

6 Algoritmos paralelos

7 Acceso al sistema de ficheros

8 Nuevos tipos en la bibliotecacbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 54/126

Page 68: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Atributos

Atributos en C++11/14

4 AtributosAtributos en C++11/14Nuevos atributosOtras modificaciones sobre atributos

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 55/126

Page 69: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Atributos

Atributos en C++11/14

Atributos

Una manera portable de introducir anotaciones.Mejor que __attribute__, __declspec, . . .No pueden tener efecto semántico.

Atributos existentes en C++11:[[noreturn]].[[carries_dependency]].alignas(num).

Atributos añadidos en C++14:[[deprecated]].[[deprecated("mensaje")]].

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 56/126

Page 70: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Atributos

Atributos en C++11/14

Atributos

Una manera portable de introducir anotaciones.Mejor que __attribute__, __declspec, . . .No pueden tener efecto semántico.

Atributos existentes en C++11:[[noreturn]].[[carries_dependency]].alignas(num).

Atributos añadidos en C++14:[[deprecated]].[[deprecated("mensaje")]].

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 56/126

Page 71: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Atributos

Atributos en C++11/14

Atributos

Una manera portable de introducir anotaciones.Mejor que __attribute__, __declspec, . . .No pueden tener efecto semántico.

Atributos existentes en C++11:[[noreturn]].[[carries_dependency]].alignas(num).

Atributos añadidos en C++14:[[deprecated]].[[deprecated("mensaje")]].

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 56/126

Page 72: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Atributos

Nuevos atributos

4 AtributosAtributos en C++11/14Nuevos atributosOtras modificaciones sobre atributos

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 57/126

Page 73: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Atributos

Nuevos atributos

Sentencias switch

Errores típicos en sentencias switch:switch (estado) {

case modo::inicio:procesa_inicio() ; // ¿Paso intencionado a siguiente caso?

case modo::intermedio:procesa_intermedio();break;

case modo::fin:procesa_fin(); // ¿Paso intencionado a siguiente caso?

default:procesa_defecto();

}

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 58/126

Page 74: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Atributos

Nuevos atributos

Mejorando switch

Fuerza a ser explícito sobre la intención con atributo[[fallthrough]].switch (estado) {

case modo::inicio:procesa_inicio() ; // Warning: fallthrough implí cito

case modo::intermedio:procesa_intermedio();break;

case modo::fin:procesa_fin(); // OK: falltrhough explí cito[[ fallthrough ]];

default:procesa_defecto();

}

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 59/126

Page 75: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Atributos

Nuevos atributos

Ignorando resultados

C++ permite ignorar el resultado de una función:int lee_bytes(std :: ifstream & f , int n);// ...void f (std :: ifstream & fs) {

lee_bytes(fs, 100); // resultado ignorado// ...

}

Se pude forzar que no se pueda ignorar con[[nodiscard]]:[[ nodiscard]] int lee_bytes(std :: ifstream & f , int n);// ...void f (std :: ifstream & fs) {

lee_bytes(fs, 100); // warning: resultado ignoradoint r = lee_bytes(fs, 50); // OK// ...

}

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 60/126

Page 76: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Atributos

Nuevos atributos

Ignorando resultados

C++ permite ignorar el resultado de una función:int lee_bytes(std :: ifstream & f , int n);// ...void f (std :: ifstream & fs) {

lee_bytes(fs, 100); // resultado ignorado// ...

}

Se pude forzar que no se pueda ignorar con[[nodiscard]]:[[ nodiscard]] int lee_bytes(std :: ifstream & f , int n);// ...void f (std :: ifstream & fs) {

lee_bytes(fs, 100); // warning: resultado ignoradoint r = lee_bytes(fs, 50); // OK// ...

}

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 60/126

Page 77: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Atributos

Nuevos atributos

Tipos no descartables

Se puede marcar un tipo como no descartable:[[ nodiscard]] struct resultado {

int resultado;string mensaje;

};

resultado haz_algo();

void f () {haz_algo(); // warning: resultado descartadoauto r = haz_algo(); // OK// ...

}

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 61/126

Page 78: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Atributos

Nuevos atributos

Variables no usadas

La mayoría de los compiladores emiten una advertencia sino se usa una variable.void f ( int a, int b) { // warning: b no usado

int z = 0; // warning: z no usadoreturn a ∗2;

}

Se puede expresar la intención con [[maybe_unused]]:void f ( int a, [[ maybe_unused]] int b) { // OK: b no usado

[[ maybe_unused]] int z = 0; // OK: z no usadoreturn a ∗2;

}

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 62/126

Page 79: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Atributos

Nuevos atributos

Variables no usadas

La mayoría de los compiladores emiten una advertencia sino se usa una variable.void f ( int a, int b) { // warning: b no usado

int z = 0; // warning: z no usadoreturn a ∗2;

}

Se puede expresar la intención con [[maybe_unused]]:void f ( int a, [[ maybe_unused]] int b) { // OK: b no usado

[[ maybe_unused]] int z = 0; // OK: z no usadoreturn a ∗2;

}

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 62/126

Page 80: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Atributos

Otras modificaciones sobre atributos

4 AtributosAtributos en C++11/14Nuevos atributosOtras modificaciones sobre atributos

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 63/126

Page 81: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Atributos

Otras modificaciones sobre atributos

Atributos en nuevos lugares

Se añaden atributos a nuevos elementos:Espacios de nombre:namespace [[deprecated]] mi_lib_anterior {

void f1 () ;// ...

}

void g() {mi_lib_anterior :: f1 () ; // Warning: deprecated// ...

}

Enumeradores de un enumerado:enum modo {

apagado,enciendiendo [[deprecated]],encendido

};

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 64/126

Page 82: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Atributos

Otras modificaciones sobre atributos

Atributos desconocidos ignorados

Antes de C++17 un compilador podía dar un error para unatributo que no reconocía (p.ej. de otro compilador):void f (void ∗ p) {

[[ gsl :: supress("type") ]] // Solamente reconocido por clang−tidyint ∗ q = reinterpret_cast<int∗>(p);// ...

}

Ahora no puede dar un error.Aunque si un warning.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 65/126

Page 83: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Atributos

Otras modificaciones sobre atributos

Espacios de nombre y atributos

En C++11/14 los espacios de nombre de atributos debencualificar explícitamente cada atributo.void f (X x, Y y) {

[[ rpr :: kernel, rpr :: target (cpu,gpu,fpga), rpr :: in (x) , rpr :: out(y) ]]do_f(x,y) ;// ...

}

En C++17 se puede evitar la repetición:void f (X x, Y y) {

[[ using rpr: kernel, target (cpu,gpu,fpga), in (x) , out(y) ]]do_f(x,y) ;// ...

}

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 66/126

Page 84: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Atributos

Otras modificaciones sobre atributos

Espacios de nombre y atributos

En C++11/14 los espacios de nombre de atributos debencualificar explícitamente cada atributo.void f (X x, Y y) {

[[ rpr :: kernel, rpr :: target (cpu,gpu,fpga), rpr :: in (x) , rpr :: out(y) ]]do_f(x,y) ;// ...

}

En C++17 se puede evitar la repetición:void f (X x, Y y) {

[[ using rpr: kernel, target (cpu,gpu,fpga), in (x) , out(y) ]]do_f(x,y) ;// ...

}

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 66/126

Page 85: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Simplificaciones

1 Pequeños cambios

2 Aclaraciones

3 Programación genérica

4 Atributos

5 Simplificaciones

6 Algoritmos paralelos

7 Acceso al sistema de ficheros

8 Nuevos tipos en la bibliotecacbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 67/126

Page 86: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Simplificaciones

Vinculación estructurada

5 SimplificacionesVinculación estructuradaIniciación en if y switchVariables inline

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 68/126

Page 87: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Simplificaciones

Vinculación estructurada

Múltiples valores de retorno

En C++14, se pueden gestionar múltiples valores deretorno con std::tuple y std::tie.std :: tuple<int, string , bool> f() {

return make_tuple(1, "hola", false) ;}

void g() {int n;std :: string msg;bool result ;

std :: tie (n, msg, result) = f () ;// ...

}

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 69/126

Page 88: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Simplificaciones

Vinculación estructurada

Vinculación estructurada

En C++17, se introducen las vinculacionesestructuradas:std :: tuple<int, string , bool> f() {

return make_tuple(1, "hola", false) ;}

void g() {auto [n, msg, result ] = f () ;// ...

}

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 70/126

Page 89: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Simplificaciones

Vinculación estructurada

Otras vinculaciones estructuradas

Las vinculaciones estructuradas no están limitadas atuplas.

Arrays:double v[] = {1, 2, 3};auto [a,b,c] = v;

Para cualquier tipo que soporte tuple_size<> yget<N>() (p. ej. std::pair).pair<int, string> f () ;

auto [x,y] = f () ;

Estructuras sin datos miembro estáticos.struct X { int a; double b; char c; };X f () ;const auto [x,y,z] = f () ;

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 71/126

Page 90: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Simplificaciones

Vinculación estructurada

Otras vinculaciones estructuradas

Las vinculaciones estructuradas no están limitadas atuplas.

Arrays:double v[] = {1, 2, 3};auto [a,b,c] = v;

Para cualquier tipo que soporte tuple_size<> yget<N>() (p. ej. std::pair).pair<int, string> f () ;

auto [x,y] = f () ;

Estructuras sin datos miembro estáticos.struct X { int a; double b; char c; };X f () ;const auto [x,y,z] = f () ;

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 71/126

Page 91: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Simplificaciones

Vinculación estructurada

Otras vinculaciones estructuradas

Las vinculaciones estructuradas no están limitadas atuplas.

Arrays:double v[] = {1, 2, 3};auto [a,b,c] = v;

Para cualquier tipo que soporte tuple_size<> yget<N>() (p. ej. std::pair).pair<int, string> f () ;

auto [x,y] = f () ;

Estructuras sin datos miembro estáticos.struct X { int a; double b; char c; };X f () ;const auto [x,y,z] = f () ;

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 71/126

Page 92: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Simplificaciones

Vinculación estructurada

Combinando vinculaciones estructuradas y bucles derango

Se pueden combinar las vinculaciones estructuradas conel uso de bucles for basados en rango.std :: map<int, std:: string> dic ;// ...for (auto & [id , nombre] : dic) {

cout << "Id : " << id << "\n";cout << "Nombre: " << nombre << "\n";

}

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 72/126

Page 93: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Simplificaciones

Iniciación en if y switch

5 SimplificacionesVinculación estructuradaIniciación en if y switchVariables inline

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 73/126

Page 94: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Simplificaciones

Iniciación en if y switch

Iniciación en if

Se extiende la sintaxis de if para introducir declaracionesde variable.if ( init ; cond) statement;

Antes

{auto val = get_value();if (val>0) {

f (val ) ;}else throw invalid {};

}

Después

if (auto val = get_value(); val>0) {f (val ) ;

}else throw invalid {};

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 74/126

Page 95: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Simplificaciones

Iniciación en if y switch

Iniciación en if

Se extiende la sintaxis de if para introducir declaracionesde variable.if ( init ; cond) statement;

Antes

{auto val = get_value();if (val>0) {

f (val ) ;}else throw invalid {};

}

Después

if (auto val = get_value(); val>0) {f (val ) ;

}else throw invalid {};

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 74/126

Page 96: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Simplificaciones

Iniciación en if y switch

Iniciación en if

Se extiende la sintaxis de if para introducir declaracionesde variable.if ( init ; cond) statement;

Antes

{auto val = get_value();if (val>0) {

f (val ) ;}else throw invalid {};

}

Después

if (auto val = get_value(); val>0) {f (val ) ;

}else throw invalid {};

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 74/126

Page 97: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Simplificaciones

Iniciación en if y switch

Buscando en cadenas

Antes

{const auto it = texto . find ("hola") ;if ( it != string :: npos) {

cout << "Encontrado en posición "<< distance(text .begin() , it ) << "\n"

}}

Después

if (const auto it = texto . find ("hola") ; ( it != string :: npos) {cout << "Encontrado en posición "

<< distance(text .begin() , it ) << "\n"}

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 75/126

Page 98: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Simplificaciones

Iniciación en if y switch

Buscando en cadenas

Antes

{const auto it = texto . find ("hola") ;if ( it != string :: npos) {

cout << "Encontrado en posición "<< distance(text .begin() , it ) << "\n"

}}

Después

if (const auto it = texto . find ("hola") ; ( it != string :: npos) {cout << "Encontrado en posición "

<< distance(text .begin() , it ) << "\n"}

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 75/126

Page 99: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Simplificaciones

Iniciación en if y switch

Buscando en un mapa

Se puede combinar con vinculaciones estructuradas.

std :: map<int,std::string> m;// ...if (auto & [ it , encontrado] : m.insert(valor ) ; encontrado) {

f ( it ) ;}

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 76/126

Page 100: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Simplificaciones

Iniciación en if y switch

Iniciación en switch

Funcionalidad extendida también a switch:

switch (auto x = get_value(); x.status () ) {case abierto:

procesa_abierto(x);break;

case cerrado:procesa_cerrado(x);break;

}

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 77/126

Page 101: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Simplificaciones

Variables inline

5 SimplificacionesVinculación estructuradaIniciación en if y switchVariables inline

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 78/126

Page 102: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Simplificaciones

Variables inline

Variables inline

Una variable marcada como inline:Puede aparecer en varias unidades de traducción si tienela misma definición.

Permite poner la definición en un archivo de cabecera.

Debe estar definida en cada unidad de traducción en la quese usa.Hay una única instancia.

Los datos miembro que sean constexpr y static sonimplícitamente inline.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 79/126

Page 103: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Simplificaciones

Variables inline

Variables inline

Una variable marcada como inline:Puede aparecer en varias unidades de traducción si tienela misma definición.

Permite poner la definición en un archivo de cabecera.

Debe estar definida en cada unidad de traducción en la quese usa.Hay una única instancia.

Los datos miembro que sean constexpr y static sonimplícitamente inline.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 79/126

Page 104: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Simplificaciones

Variables inline

Variables inline

Una variable marcada como inline:Puede aparecer en varias unidades de traducción si tienela misma definición.

Permite poner la definición en un archivo de cabecera.

Debe estar definida en cada unidad de traducción en la quese usa.

Hay una única instancia.

Los datos miembro que sean constexpr y static sonimplícitamente inline.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 79/126

Page 105: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Simplificaciones

Variables inline

Variables inline

Una variable marcada como inline:Puede aparecer en varias unidades de traducción si tienela misma definición.

Permite poner la definición en un archivo de cabecera.

Debe estar definida en cada unidad de traducción en la quese usa.Hay una única instancia.

Los datos miembro que sean constexpr y static sonimplícitamente inline.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 79/126

Page 106: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Simplificaciones

Variables inline

Variables inline

Una variable marcada como inline:Puede aparecer en varias unidades de traducción si tienela misma definición.

Permite poner la definición en un archivo de cabecera.

Debe estar definida en cada unidad de traducción en la quese usa.Hay una única instancia.

Los datos miembro que sean constexpr y static sonimplícitamente inline.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 79/126

Page 107: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Simplificaciones

Variables inline

Constantes en C++14

tabla.h

static constexpr max_elem = 4096;

class tabla {// ...

private:static constexpr max_valor = 1000000;// ...

};

tabla.cpp

static constexpr max_elem;static constexpr tabla :: max_valor;

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 80/126

Page 108: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Simplificaciones

Variables inline

Constantes en C++17

tabla.h

inline static constexpr max_elem = 4096;

class tabla {// ...

private:// Implícitament einlinestatic constexpr max_valor = 1000000;// ...

};

tabla.cpp

// Sin definiciones de constantes// ...

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 81/126

Page 109: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Algoritmos paralelos

1 Pequeños cambios

2 Aclaraciones

3 Programación genérica

4 Atributos

5 Simplificaciones

6 Algoritmos paralelos

7 Acceso al sistema de ficheros

8 Nuevos tipos en la bibliotecacbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 82/126

Page 110: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Algoritmos paralelos

Políticas de ejecución

6 Algoritmos paralelosPolíticas de ejecuciónVisión generalAlgoritmos no numéricosAlgortimos numéricos

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 83/126

Page 111: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Algoritmos paralelos

Políticas de ejecución

Introducción

Una Política de ejecución indica el tipo de paralelismoque se permite en la ejecución de un algoritmo.

Secuencial: Sin paralelizar.Tipo: std::execution::sequenced_policyObjeto global: std::execution::seq.

Paralelo: Paralelizado.Tipo: std::execution::parallel_policy.Objeto global: std::execution::par.

Paralelo + Vector: Paralelizado y vectorizado.Tipo:std::execution::parallel_unsequenced_policy.Objeto global: std::execution::par_unseq.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 84/126

Page 112: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Algoritmos paralelos

Políticas de ejecución

Versiones de algoritmos

Todos los algoritmos paralelos toman como primerparámetro una política de ejecución.

Ejemplo: ordenando un vector

using namespace std;vector<double> v = read_values();sort (v.begin() , v.end()) ;

using namespace std::execution;

sort (seq, v.begin() , v.end()) ; // Secuencialsort (par, v.begin() , v.end()) ; // Paralelosort (par_unseq, v.begin(), v.end()) ; // Paralelo+Vect

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 85/126

Page 113: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Algoritmos paralelos

Visión general

6 Algoritmos paralelosPolíticas de ejecuciónVisión generalAlgoritmos no numéricosAlgortimos numéricos

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 86/126

Page 114: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Algoritmos paralelos

Visión general

¿Qué algoritmos se incluyen?

La biblioteca de algoritmos paralelos incluye la mayorparte de los algoritmos de la STL.En todos los casos se añade un parámetro adicional paraindicar la política de ejecución.

Este parámetro se coloca el primero.Hay algoritmos de la STL que pueden no estar.

Ejemplo accumulate.Hay algoritmos que no provienen de la STL.

Ejemplo: exclusive_scan

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 87/126

Page 115: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Algoritmos paralelos

Visión general

Buscando en una secuencia

Ejemplos

vector<int> v = get_values_vector();count_if (par, begin(v), end(v),

[]( int x) { return x>0; }) ;auto p = find (par, begin(v), end(v), 0);auto q = find_if (par, begin(v), end(v),

[]( int x) { return (x>0) && (x<10); }

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 88/126

Page 116: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Algoritmos paralelos

Algoritmos no numéricos

6 Algoritmos paralelosPolíticas de ejecuciónVisión generalAlgoritmos no numéricosAlgortimos numéricos

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 89/126

Page 117: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Algoritmos paralelos

Algoritmos no numéricos

Algoritmos no numéricos

Son algoritmos que no requieren que los valoresaccedidos por los iteradores sean de un tipo numérico.

Más generales que los algoritmos numéricos.Ejemplos:

for_each().for_each_n().

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 90/126

Page 118: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Algoritmos paralelos

Algoritmos no numéricos

For Each

template <class ExecutionPolicy, class InputIterator, class Function>void for_each(ExecutionPolicy && ep,

InputIterator first , InputIterator last ,Function f ) ;

Aplica f al resultado de desreferenciar cada iterador en elrango [first,last).

Ejemplo

long cuenta_primos(const vector<int> & v) {std :: atomic<long> count;for_each(par, begin(v), end(v), [&]( int x) {

if (esprimo(x)) { count++; }}) ;return count;

}

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 91/126

Page 119: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Algoritmos paralelos

Algoritmos no numéricos

For Each

template <class ExecutionPolicy, class InputIterator, class Size, class Function>void for_each_n(ExecutionPolicy && ep,

InputIterator first , Size n,Function f ) ;

Aplica f al resultado de desreferenciar cada iterador en elrango [first, first+n).

Ejemplo

long cuenta_primos(const vector<int> & v, int k) {std :: atomic<long> count;for_each_(par, begin(v), k, [&]( int x) {

if (esprimo(x)) { count++; }}) ;return count;

}

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 92/126

Page 120: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Algoritmos paralelos

Algortimos numéricos

6 Algoritmos paralelosPolíticas de ejecuciónVisión generalAlgoritmos no numéricosAlgortimos numéricos

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 93/126

Page 121: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Algoritmos paralelos

Algortimos numéricos

Algoritmos numéricos

Algoritmos orientados a secuencias numéricas.reduce.exclusive_scan.inclusive_scan.transform_reduce.transform_exclusive_scan.transform_inclusive_scan.

También se añaden las versiones sin parámetro depolítica.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 94/126

Page 122: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Algoritmos paralelos

Algortimos numéricos

Operaciones básicas

Operaciones usadas en la definición de la semántica dealgoritmos.GENERALIZED_SUM yGENERALIZED_NONCOMMUTATIVE_SUM.

Conceptualmente suma (aunque aplicable a cualquieroperador).

GENERALIZED_SUM(op, a1, ..., aN):Concepto de suma commutativa.Puede aplicar la operación en cualquier orden.

Concepto de suma no commutativa.Restricciones sobre el orden.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 95/126

Page 123: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Algoritmos paralelos

Algortimos numéricos

GENERALIZED_SUM

GENERALIZED_SUM(op, a1, ..., aN):op(GENERALIZED_SUM(op,b1,..., bK),GENERALIZED_SUM(op,bL, ..., bN)).b1, ..., bK,bL, ..., bN es una permutación de a1,ldots, aN.

GENERALIZED_NONCOMMUTATIVE_SUM(op, a1, ...,aN):

op(GENERALIZED_SUM(op,a1,..., aK),GENERALIZED_SUM(op,aL, ..., bN)).

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 96/126

Page 124: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Algoritmos paralelos

Algortimos numéricos

reduce

template <class InputIterator, class T, class BinaryOperation>T reduce( InputIterator first , InputIterator last , T init , BinaryOperation op);

GENERALIZED_SUM(op, init, *first, ...)

op no puede invalidar iteradores en el rango tratado.op no puede modificar valores almacenados en el rango.reduce puede no ser determinista cuando op es noasociativo o no conmutativo.

Ejemplo

reduce(begin(v), end(v), 0, []( int a, int b) {return a+b; }) ;

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 97/126

Page 125: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Algoritmos paralelos

Algortimos numéricos

Variantes de reduce

template <class InputIterator, class T, class BinaryOperation>T reduce( InputIterator first , InputIterator last , T init ) ;

Utiliza como operación por defecto la suma.reduce(first,last,init,plus<>()).

template <class InputIterator, class T, class BinaryOperation>T reduce( InputIterator first , InputIterator last ) ;

Utiliza como operación por defecto la suma.Utiliza como valor por defecto el valor por defecto para eltipo usado para valores.reduce(first,last,x,plus<>()).

x es el valor por defecto para el tipo de valor.decltype(*first) x{};

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 98/126

Page 126: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Algoritmos paralelos

Algortimos numéricos

Variantes de reduce

template <class InputIterator, class T, class BinaryOperation>T reduce( InputIterator first , InputIterator last , T init ) ;

Utiliza como operación por defecto la suma.reduce(first,last,init,plus<>()).

template <class InputIterator, class T, class BinaryOperation>T reduce( InputIterator first , InputIterator last ) ;

Utiliza como operación por defecto la suma.Utiliza como valor por defecto el valor por defecto para eltipo usado para valores.reduce(first,last,x,plus<>()).

x es el valor por defecto para el tipo de valor.decltype(*first) x{};

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 98/126

Page 127: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Algoritmos paralelos

Algortimos numéricos

Transform reduce

template <class InputIterator, class T, class UnaryOp, class BinaryOp>T transform_reduce(InputIterator first , InputIterator last ,

UnaryOp unary_op, T init, BinaryOp binary_op);

Realiza una reducción con binary_op con el resultadode aplicar unary_op a los elementos.

unary_op no se aplica a init.Reducciones realizadas con GENERALIZED_SUM sobrebinary_op.

Ejemplo

auto suma_cuadrados = transform_reduce(begin(v), end(v),[]( double x) { return x ∗ x; },0,[]( double x, double y) { return x + y; }

) ;

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 99/126

Page 128: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Algoritmos paralelos

Algortimos numéricos

scan

Dos variantes:inclusive_scan: Realiza scan hasta i-ésimo elemento.exclusive_scan: Realiza scan hasta justo antes deli-ésimo elemento.

En ambos casos:Las operaciones se realizan en términos deGENERALIZED_NONCOMMUTATIVE_SUM.La operación no puede invalidar ni iteradores ni modificarelementos.

Ejemplo

auto fin = exclusive_scan(begin(v), end(v), begin(w));

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 100/126

Page 129: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Algoritmos paralelos

Algortimos numéricos

exclusive scan

template <class InputIterator, class OutputIterator , class T,class BinaryOp>

OutputIterator exclusive_scan( InputItertor first , InputIterator last ,OutputIterator out,T init , BinaryOp op);

Para cada i en el rango [out, out +(last-first)):

Le asigna el resultado deGENERALIZED_NONCOMMUTATIVE_SUM(op, init,*first, ..., *(first+(i-out)-1)).

Devuelve el fin del rango resultado.Si se omite op equivale a:

exclusive_scan(first, last, out, init,plus<>())

No se puede omitir init.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 101/126

Page 130: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Algoritmos paralelos

Algortimos numéricos

inclusive scan

template <class InputIterator, class OutputIterator , class T,class BinaryOp>

OutputIterator inclusive_scan( InputItertor first , InputIterator last ,OutputIterator out,T init , BinaryOp op);

Para cada i en el rango [out, out +(last-first)):

Le asigna el resultado deGENERALIZED_NONCOMMUTATIVE_SUM(op, init,*first, ..., *(first+(i-out))).

Devuelve el fin del rango resultado.Si se omite op equivale a:

exclusive_scan(first, last, out, init,plus<>())

Si se omite init no se incorpora a la suma generalizada.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 102/126

Page 131: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Algoritmos paralelos

Algortimos numéricos

Ejemplo

Calculando la CDF de un histograma

vector<int> histogram = compute_histogram();vector<int> cdf(histogram.size() , 0);inclusive_scan(par, begin(histogram), end(histogram),

begin(cdf)) ;

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 103/126

Page 132: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Algoritmos paralelos

Algortimos numéricos

transform scan

Una versión para transform_exclusive_scan

template <class InputIterator, class OutputIterator ,class UnaryOp, class T, class BinaryOp>

OutputIterator transform_exclusive_scan(InputItertor first , InputIterator last , OutputIterator out,UnaryOp unary_op, T init, BinaryOp binary_op);

Dos versiones para transform_inclusive_scan

template <class InputIterator, class OutputIterator ,class UnaryOp, class BinaryOp>

OutputIterator transform_inclusive_scan(InputItertor first , InputIterator last , OutputIterator out,UnaryOp unary_op, BinaryOp binary_op);

template <class InputIterator, class OutputIterator ,class UnaryOp, class BinaryOp, class T>

OutputIterator transform_exclusive_scan(InputItertor first , InputIterator last , OutputIterator out,UnaryOp unary_op, BinaryOp binary_op, T init);

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 104/126

Page 133: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Algoritmos paralelos

Algortimos numéricos

Ejemplo

Calculando la CDF de un histograma

vector<int> histogram = compute_histogram();vector<int> cdf(histogram.size() , 0);transform_inclusive_scan(par, begin(histogram), end(histogram),

begin(cdf)[]( int x) {

if (x<0) return 0;if (x>255) return 255;return x;

}[]( int x, int y) { return x+y; }) ;

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 105/126

Page 134: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Acceso al sistema de ficheros

1 Pequeños cambios

2 Aclaraciones

3 Programación genérica

4 Atributos

5 Simplificaciones

6 Algoritmos paralelos

7 Acceso al sistema de ficheros

8 Nuevos tipos en la bibliotecacbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 106/126

Page 135: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Acceso al sistema de ficheros

Sistema de ficheros

Ofrece una biblioteca portable para acceder al sistema dearchivos.

Archivo de cabecera <filesystem>.Espacio de nombres std::fileystem.

Componentes:Gestión de paths.Gestion de directorios.Recorrido de directorios.Funciones de soporte.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 107/126

Page 136: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Acceso al sistema de ficheros

Sistema de ficheros

Ofrece una biblioteca portable para acceder al sistema dearchivos.

Archivo de cabecera <filesystem>.Espacio de nombres std::fileystem.

Componentes:Gestión de paths.Gestion de directorios.Recorrido de directorios.Funciones de soporte.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 107/126

Page 137: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Acceso al sistema de ficheros

Información de una ruta

void f (std :: string path_name) {using fs = std :: filesystem;

fs :: path mi_path{path_name};cout << "exists () = " << fs :: exists (mi_path) << "\n"

<< "root_name() = " << mi_path.root_name() << "\n"<< "root_path() = " << mi_path.root_path() << "\n"<< "relative_path () = " << mi_path.relative_path() << "\n"<< "parent_path() = " << mi_path.parent_path() << "\n"<< "filename() = " << mi_path.filename() << "\n"<< "stem() = " << mi_path.stem() << "\n"<< "extension() = " << mi_path.extension() << "\n";

}

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 108/126

Page 138: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Acceso al sistema de ficheros

Componiendo un path

Operador /=:

using fs = namespace std::filesystem;fs :: path p{" /usr/include" };p /= "c++";p /= "7.2.0"p /= "iostream"

Operador +=:

using fs = namespace std::filesystem;fs :: path p{" /usr/include" };p += "c++";p += "7.2.0"p += "iostream"

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 109/126

Page 139: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Acceso al sistema de ficheros

Componiendo un path

Operador /=:

using fs = namespace std::filesystem;fs :: path p{" /usr/include" };p /= "c++";p /= "7.2.0"p /= "iostream"

Operador +=:

using fs = namespace std::filesystem;fs :: path p{" /usr/include" };p += "c++";p += "7.2.0"p += "iostream"

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 109/126

Page 140: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Acceso al sistema de ficheros

Recorriendo un path

void f (std :: filesystem :: path & p) {for (auto & x : p) {

cout << x << "\n";}

}

usrincludec++7.2.0iostream

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 110/126

Page 141: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Nuevos tipos en la biblioteca

1 Pequeños cambios

2 Aclaraciones

3 Programación genérica

4 Atributos

5 Simplificaciones

6 Algoritmos paralelos

7 Acceso al sistema de ficheros

8 Nuevos tipos en la bibliotecacbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 111/126

Page 142: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Nuevos tipos en la biblioteca

Valores generalizados

8 Nuevos tipos en la bibliotecaValores generalizadosValores opcionalesRegistros con variantesVistas sobre cadenas

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 112/126

Page 143: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Nuevos tipos en la biblioteca

Valores generalizados

Valores any

Nuevo tipo any para representar un valor de cualquier tipo.

Es como un void* seguro en tipos.

Usando optional

void agrega_elemento(std::vector<std::any> & v, int id) {if (es_valido_A(id)) v.push_back(elemento{id});else if (es_valido_B(id)) v.push_back(compuesto{id});else v.push_back(derivado{id});

}

void imprime_elementos(const std::vector<std::any> & v) {for (auto & x : v) {

if (x.type() == typeid(elemento)) {std :: cout << x << std :: endl;

}}

}cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 113/126

Page 144: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Nuevos tipos en la biblioteca

Valores opcionales

8 Nuevos tipos en la bibliotecaValores generalizadosValores opcionalesRegistros con variantesVistas sobre cadenas

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 114/126

Page 145: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Nuevos tipos en la biblioteca

Valores opcionales

Nueva clase optional

Nuevo tipo optional para representar un valor quepuede estar o no presente.

Usando optional

std :: optional<elemento> obten_elemento(int id) {if (es_valido(id) ) return elemento{id};else return {};

}

void f ( int id ) {auto e = obten_elemento;if (e) cout << ∗e << endl;else cout << "vacio" << endl;

}

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 115/126

Page 146: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Nuevos tipos en la biblioteca

Registros con variantes

8 Nuevos tipos en la bibliotecaValores generalizadosValores opcionalesRegistros con variantesVistas sobre cadenas

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 116/126

Page 147: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Nuevos tipos en la biblioteca

Registros con variantes

El tipo variant

Nuevo tipo variant valores de un número cerrado detipos

Es como un void* seguro en tipos.

Usando variant

void f () {std :: variant<int, std :: string , double> v;

v = 42;int x = get<int>(v);

try {auto d = get<double>(v);

}catch (std :: bad_variant_access&) {}

}

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 117/126

Page 148: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Nuevos tipos en la biblioteca

Registros con variantes

struct mi_visitor {void operator()(const int & i) { std :: cout << " int : " << i << "\n"; }void operator()(const double & d) { std::cout << "double: " << d << "\n"; }

};

void f () {std :: variant<int, float> v;

v = 2.0;std :: visit ( mi_visitor {}, v) ;

v = 5;std :: visit ( mi_visitor {}, v) ;

}

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 118/126

Page 149: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Nuevos tipos en la biblioteca

Vistas sobre cadenas

8 Nuevos tipos en la bibliotecaValores generalizadosValores opcionalesRegistros con variantesVistas sobre cadenas

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 119/126

Page 150: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Nuevos tipos en la biblioteca

Vistas sobre cadenas

string_view

Define un objeto que se refiere a una secuencia decaracteres constante.

Tiene una interfaz muy similar a std::string.

std :: string_view sv1 = "hola";auto sv2 = "adios"sv;

std :: string s = "Daniel"std :: string_view sv3 = s;

std :: cout << sv3 << std::endl;

auto sv4 = "C++ mola";sv4 = sv4.substr(3) ;

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 120/126

Page 151: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Nuevos tipos en la biblioteca

Vistas sobre cadenas

¿Y después?

Ya estamos trabajando en C++20:Mejor programación genérica con conceptos B. Stroustrupet al.Mejor procesamiento asíncrono con corrutinas G.NishanovMejor estructuración con módulos G. Dos ReisMejor detección de defectos con contratos J. DanielGarcía. . .

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 121/126

Page 152: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Nuevos tipos en la biblioteca

Vistas sobre cadenas

Resumen

Limpieza de características antiguas.

C++ es un lenguaje en constante evolución.Un lenguaje algo más predecible.Mejor soporte (ligeramente) de programación genérica.Mayor uso de atributos.Simplificaciones en el lenguaje para código más claro.Algoritmos paralelos y acceso al sistema de fichero.Algunos tipos nuevos en la biblioteca.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 122/126

Page 153: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Nuevos tipos en la biblioteca

Vistas sobre cadenas

Resumen

Limpieza de características antiguas.C++ es un lenguaje en constante evolución.

Un lenguaje algo más predecible.Mejor soporte (ligeramente) de programación genérica.Mayor uso de atributos.Simplificaciones en el lenguaje para código más claro.Algoritmos paralelos y acceso al sistema de fichero.Algunos tipos nuevos en la biblioteca.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 122/126

Page 154: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Nuevos tipos en la biblioteca

Vistas sobre cadenas

Resumen

Limpieza de características antiguas.C++ es un lenguaje en constante evolución.Un lenguaje algo más predecible.

Mejor soporte (ligeramente) de programación genérica.Mayor uso de atributos.Simplificaciones en el lenguaje para código más claro.Algoritmos paralelos y acceso al sistema de fichero.Algunos tipos nuevos en la biblioteca.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 122/126

Page 155: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Nuevos tipos en la biblioteca

Vistas sobre cadenas

Resumen

Limpieza de características antiguas.C++ es un lenguaje en constante evolución.Un lenguaje algo más predecible.Mejor soporte (ligeramente) de programación genérica.

Mayor uso de atributos.Simplificaciones en el lenguaje para código más claro.Algoritmos paralelos y acceso al sistema de fichero.Algunos tipos nuevos en la biblioteca.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 122/126

Page 156: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Nuevos tipos en la biblioteca

Vistas sobre cadenas

Resumen

Limpieza de características antiguas.C++ es un lenguaje en constante evolución.Un lenguaje algo más predecible.Mejor soporte (ligeramente) de programación genérica.Mayor uso de atributos.

Simplificaciones en el lenguaje para código más claro.Algoritmos paralelos y acceso al sistema de fichero.Algunos tipos nuevos en la biblioteca.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 122/126

Page 157: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Nuevos tipos en la biblioteca

Vistas sobre cadenas

Resumen

Limpieza de características antiguas.C++ es un lenguaje en constante evolución.Un lenguaje algo más predecible.Mejor soporte (ligeramente) de programación genérica.Mayor uso de atributos.Simplificaciones en el lenguaje para código más claro.

Algoritmos paralelos y acceso al sistema de fichero.Algunos tipos nuevos en la biblioteca.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 122/126

Page 158: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Nuevos tipos en la biblioteca

Vistas sobre cadenas

Resumen

Limpieza de características antiguas.C++ es un lenguaje en constante evolución.Un lenguaje algo más predecible.Mejor soporte (ligeramente) de programación genérica.Mayor uso de atributos.Simplificaciones en el lenguaje para código más claro.Algoritmos paralelos y acceso al sistema de fichero.

Algunos tipos nuevos en la biblioteca.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 122/126

Page 159: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Nuevos tipos en la biblioteca

Vistas sobre cadenas

Resumen

Limpieza de características antiguas.C++ es un lenguaje en constante evolución.Un lenguaje algo más predecible.Mejor soporte (ligeramente) de programación genérica.Mayor uso de atributos.Simplificaciones en el lenguaje para código más claro.Algoritmos paralelos y acceso al sistema de fichero.Algunos tipos nuevos en la biblioteca.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 122/126

Page 160: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Nuevos tipos en la biblioteca

Vistas sobre cadenas

Si quieres más C++

https://usingstdcpp.org/

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 123/126

Page 161: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Nuevos tipos en la biblioteca

Vistas sobre cadenas

La fundación C++

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 124/126

Page 162: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Nuevos tipos en la biblioteca

Vistas sobre cadenas

No olvidéis

¡¡¡Dadme feedback!!!

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 125/126

Page 163: C++17 - The next generation · C++17 ARCOS@uc3m ARCOS: Investigación aplicada. Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos de programación para la mejora de aplicaciones.

C++17

Nuevos tipos en la biblioteca

Vistas sobre cadenas

C++17The next generation

J. Daniel Garcia

Grupo ARCOSUniversidad Carlos III de Madrid

Noviembre 2017

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 126/126


Recommended