2010-03-07 15 views

Respuesta

13

Los bloques son, esencialmente, una forma de pasar el código y el alcance como datos. Son conocidos en algunos otros idiomas como cierres y funciones anónimas.

Aquí hay un article con más detalles y ejemplos de código.

+8

BTW la próxima versión de C++ también tiene cierres, a través de la sintaxis lambda. –

+12

BTW la versión * actual * de C++ también tiene cierres, a través de la sintaxis lambda. –

+1

BTW la _previous_ versión de C++ también tenía cierres, a través de la sintaxis lambda. – Regexident

0

Por lo que tengo entendido, esta extensión es para el marco Grand Central Dispatch de Apple. Los bloques son entidades diminutas programables/en cola que se pueden ejecutar potencialmente en paralelo.

+5

Jesus. GCD es *** una *** API que usa bloques. Pero decir que son una extensión para ese marco es ridículo; ellos agregan cierres al lenguaje. Nada más y nada menos. La existencia de un marco que los utiliza con gran efecto no tiene ninguna implicación en su propósito u origen. –

+1

Oh, muchacho, no es otra panacea ... –

2

Básicamente son solo el término de Apple para closures/funciones anónimas. Como señala Nikolai, ellos usan el Grand Central Dispatch para ejecutar múltiples funciones en paralelo (utilizando más de 1 núcleo) sin tener que preocuparse por el enhebrado y el bloqueo.

+7

No es la terminología de Apple. La terminología proviene de Smalltalk. Objective-C se puede ver como un híbrido de C y Smalltalk. Un compilador de Objective-C anterior que no era de Apple o que no lo hizo (llamado PoC) había agregado bloques hace muchos años y utilizaba la terminología de Smalltalk. Entonces, es natural que la terminología de Smalltalk también se haya utilizado para la implementación de Apple. – trijezdci

+0

No pretendía dar a entender que Apple lo había inventado, solo que ese es el término que eligieron para Objective-C 2.0 (y, por extensión, el del proyecto clang financiado por Apple). –

+1

Creo que Objective-C fue bastante influenciado por Smalltalk y asumió bastante de la terminología. Objective-C ha existido por bastante tiempo (IIRC en realidad es más antiguo que C++) y en ese momento Smalltalk era el estándar de oro para este tipo de cosas. – ConcernedOfTunbridgeWells

10

NanoTech ya vinculado a una explicación de los bloques. En cuanto a cómo esto se relaciona con C++ permítame expresar mi opinión personal: Esta extensión es no útil en C++. He aquí por qué:

En cuanto al tipo de referencia de bloque: Ya tenemos "funciones polimórficas" que pueden llevar algún estado a su alrededor, consulte boost::function, tr1::function. C++ incluirá una versión pulida de esto en su próxima biblioteca estándar. La ventaja sobre los "C Blocks" es que no necesita meterse con cosas como Block_copy y Block_release. Estos objetos de funciones polimórficas son lo suficientemente inteligentes como para hacer su propia administración de memoria.

En cuanto a la sintaxis literal del bloque: Es una buena sintaxis que le permite poner el código donde "pertenece" sin la necesidad de un código repetitivo. Pero lo mismo se aplica a su parte de contador C++: C++0x lambdas. Pero la característica C++ 0x lambda también le permite usar objetos lambda en circuitos internos ajustados sin costos de alto rendimiento de llamadas a funciones debido a una posible alineación.

Dado que C++ 0x lambdas también se puede usar en situaciones donde el rendimiento es un problema y std :: function es más fácil de manejar w.r.t. administración de memoria, la adición de "C Blocks" a C++ parece redundante. Los "bloques C" parecen estar más adaptados a los idiomas que no admiten plantillas o destructores.

+1

No estoy seguro de que signifique lo que cree que quiere decir cuando dice "polimórfico". –

+3

@Jonathan: No inventé el término. Consulte el borrador estándar de C++ actual (N3092.pdf), sección 20.8.15, "Envoltorios de funciones polimórficas". Son polimórficos en el sentido de que puede envolver cualquier objeto de función siempre que las firmas sean compatibles. El tipo exacto del objeto envuelto está oculto ("borrado"). Esto se logra a través del "polimorfismo OOP clásico" (o algo equivalente). – sellibitze

Cuestiones relacionadas