c++ - installed - llvm 3.7 0
GCC(/ Clang): funciones de fusión con instrucciones idénticas(plegado COMDAT) (1)
Simplemente curioso, ¿los conjuntos de herramientas de GCC o Clang implementan el equivalente del plegado COMDAT idéntico de MSVC (ICF) actualmente? Si no, ¿hay algún plan? Parece que no puedo encontrar enlaces autorizados recientes sobre el tema que no sean los antiguos mensajes de la lista de correo de GCC.
Si no es así, ¿esto implica que las instancias de plantilla sobre distintos tipos son siempre funciones distintas en el binario resultante (en situaciones en las que no están completamente inlineadas), incluso cuando son compatibles con binario, o existen otros mecanismos en el lugar para manejar esto? en otro nivel?
Además, ¿alguien ha encontrado que ICF hace una gran diferencia al minimizar el tamaño de un ejecutable resultante en la práctica? No tengo ningún proyecto grande de MSVC a mano para probarlo. (Supongo que solo sirve de ayuda si crea instancias de plantillas en muchos tipos diferentes de formatos vtable compatibles).
Finalmente, ¿es C ++ 11 compatible con los estándares para dos funciones, punteros a diferentes funciones para comparar igual en tiempo de ejecución? Este enlace parece implicar que no lo es, pero es para C99. EDIT: encontró la pregunta anterior sobre este tema
Ni GCC ni Clang son enlazadores, y ICF debe ser realizado por el enlazador, o al menos en cooperación con el enlazador. Editar: No hacen ICF, entonces sí, distintas instancias producen código distinto. El --icf
gold
GNU es compatible con ICF con la opción --icf
, que necesita la opción de GCC -ffunction-sections
a ser usadas.
Las funciones distintas deben tener direcciones distintas ... No puedo recordar si ICF está deshabilitado para cualquier función que tenga su dirección tomada, pero si no fuera así, debería ser posible poner un montón de instrucciones no operativas antes de la función combinada y hacer cada creación de instancias distintas en una instrucción diferente, por lo que tienen diferentes direcciones. Editar: la opción gold --icf=safe
solo habilita ICF para las funciones que se puede probar que no tienen su dirección tomada, por lo que el código que se basa en distintas direcciones seguirá funcionando.
ICF es una optimización ordenada, pero no esencial. Con un poco de esfuerzo puede elevar el código no dependiente a una plantilla que no sea, o una plantilla con menos parámetros, para reducir la cantidad de código duplicado en el ejecutable. Hay más información sobre esto en las diapositivas para una charla de Plantillas de dieta que hice hace un par de años.