strict-aliasing

¿Cuál es la estricta regla de aliasing?

Al preguntar sobre el comportamiento común indefinido en C, las almas más iluminadas de lo que me referí a la estricta regla de aliasing. ¿De qué están hablando?

El uso de este puntero causa una extraña desoptimización en hot loop

Recientemente me encontré con una extraña desoptimización (o más bien una oportunidad de optimización perdida). Considere es ... estoy equivocado aquí . Cachear un puntero de miembro en un hot loop parece ser un técnica de optimización manual necesaria.

Es std:: memcpy entre diferentes tipos trivialmente copiables comportamiento indefinido?

He estado usando std::memcpy para eludir el alias estricto durante mucho tiempo. Por ejemplo, inspeccionando un float, como ... ta pregunta. Por lo que sé, podría reemplazar std::memcpy con un simple bucle de copia de bytes, y la pregunta será la misma.

"dereferencing type-punned pointer will break strict-aliasing rules" advertencia

Utilizo un código donde lanzo una enumeración* a int*. Algo como esto: enum foo { ... } ... foo foobar; int *pi = reinterpre ... y no quiero hacer una regla de Makefile separada para este archivo de origen)? Y sí, realmente necesito este tipo de alias.

Violando el estricto aliasing en C, incluso sin ningún casting?

¿Cómo pueden *i y u.i imprimir diferentes números en este código, a pesar de que i se define como int *i = &u.i;? Solo p ... C99, es aceptable escribir a través de un miembro del sindicato y luego leer a través de otro miembro de un tipo diferente.)

Dereferencing type-punned pointer will break strict-aliasing rules

Utilicé el siguiente fragmento de código para leer datos de archivos como parte de un programa más grande. double data_read( ... go. Al final no quiero ignorar las advertencias. ¿Qué recomendarías? [update] Sustituí el ejemplo toy por la función real.

¿Por qué la optimización elimina esta función?

Recientemente tuvimos una conferencia en la universidad sobre programas especiales en varios idiomas. El profesor escribió l ... ra que el compilador no las toque incluso si piensa que nunca se leen o escriben, pero no sabría por qué esto sucedería aquí.

gcc, alias estrictos e historias de terror

En gcc-strict-aliasing-and-cast-through-a-union Pregunté si alguien había encontrado problemas con el juego de palabras de u ... preguntado si esto está bien en gcc-strict-aliasing-and-casting-through-a-union , pero hasta ahora nadie está en desacuerdo.

¿Todos los punteros se derivan de los punteros a los tipos de estructura de la misma?

La pregunta La pregunta de si todos los punteros derivados de punteros a tipos de estructura son los mismos, no es fácil de ... "Un puntero a" que se usa en todo el estándar, no podemos concluir si se aplica a una derivación recursiva de tales punteros.

almacenamiento alineado y alias estrictos

Actualmente estoy usando aligned_storage para implementar un tipo 'Opcional' similar al de boost::optional. Para lograr esto ... Si es posible, me sentiría mejor si pudiera hacer referencia al estándar en su respuesta (me ayuda a dormir por la noche :P).

Se permite aliasing T* con char*. ¿También está permitido al revés?

Nota: Esta pregunta ha sido renombrada y reducida para hacerla más enfocada y legible. La mayoría de los comentarios se refi ... permitido al revés. Por ejemplo: char * c = read_socket(...); unsigned * u = reinterpret_cast<unsigned*>(c); // huh?

Manera correcta y portátil de interpretar buffer como una estructura

El contexto de mi problema está en la programación de redes. Digamos que quiero enviar mensajes a través de la red entre dos ... ta, esto es definitivamente [editar - no] rompiendo el estricto aliasing y por lo tanto tiene un comportamiento indefinido.

Proporcionar una API de C a su biblioteca de C++ y alias estrictos

Un patrón común al proporcionar una API de C es reenviar declarar algunos tipos opacos en su encabezado público que se pasan ... o, ¿por qué no? Y si es así, ¿cómo se puede llegar legalmente a este tipo de abstracción en el límite de la interfaz pública?

¿Es un comportamiento indefinido 'reinterpretar cast' a 'T *' a ' T ( * ) [N]`?

Considere el siguiente escenario: std::array<int, 8> a; auto p = reinterpret_cast<int(*)[8]>(a.data()); (*p)[0] ... por a.data() es una matriz de 8 int objetos ¿Hay alguna regla que yo soy falta que hace que este reinterpret_cast válido?

Reutilización de un búfer flotante para dobles sin comportamiento indefinido

En una función particular de C++, resulta que tengo un puntero a un gran búfer de flotadores que quiero usar temporalmente pa ... tipos no está permitido en C++). Se puede asumir que el búfer flotante está correctamente alineado para usarlo para dobles.