es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Diferente alineación de long doubles en una estructura en Linux de 64 bits con gcc y clang.

Observé que gcc y clang compilan el siguiente código de manera diferente:


struct { long double ld[1]; } ld1;
struct { long double ld[2]; } ld2;
struct { long double ld[3]; } ld3;

gcc

.comm ld1,16,16
.comm ld2,32,32
.comm ld3,48,32

clang

.type ld1,@object # @ld1
.comm ld1,16,16
.type ld2,@object # @ld2
.comm ld2,32,16
.type ld3,@object # @ld3
.comm ld3,48,16

De acuerdo con el x86_64 ABI, el alineamiento debería ser de 16. ¿Por qué gcc está alineando las dos últimas estructuras en 32?

Estoy usando gcc Ubuntu 9.3.0-17ubuntu1~20.04 9.3.0 y clang 10.0.0-4ubuntu1 en Ubuntu 20.04.1 LTS.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Según el ABI x86_64, el requisito de alineación para un long double es de 16 bytes. Sin embargo, parece haber una diferencia en cómo gcc y clang alinean las estructuras en cuestión.

    En este caso, gcc alinea las dos últimas estructuras en 32 bytes en lugar de los 16 bytes requeridos. Esto podría deberse a una estrategia de optimización específica que gcc utiliza para mejorar el rendimiento.

    Por otro lado, clang alinea las tres estructuras en 16 bytes, según la especificación del ABI. Esto podría deberse a una estrategia de optimización diferente utilizada por clang.

    Es importante tener en cuenta que si bien puede haber diferencias en cómo los diferentes compiladores alinean las estructuras en memoria, estas diferencias no implica necesariamente un comportamiento incorrecto. En general, es una buena práctica escribir código que cumpla con la especificación del ABI para garantizar la compatibilidad entre diferentes compiladores y plataformas.

Comments are closed.