Esto es algo así tanto una respuesta y una pregunta. Me doy cuenta de que este hilo está muerto, pero es exactamente lo que estaba buscando esta noche.
He hurgado un poco y lo más cercano que puedo llegar a lo que quiero (que es similar a lo que quieres ... He estado trabajando con fotos y no necesito usar C++, pero tengo curiosidad de cómo se podría hacer) es el primer ejemplo de código:
#include <iostream>
using namespace std;
extern "C"
{
typedef struct stuff
{
int x;
double y;
} things;
}
int main()
{
things jmcd = { jmcd.x = 12, jmcd.y = 10.1234 };
cout << jmcd.x << " " << jmcd.y << endl;
return 0;
}
Esto tiene un aspecto muy similar a los inicializadores designados estilo C99 con una advertencia que mencionaré más adelante. (. Es probable que terminar con esto en __cplusplus #ifdef si quería la estructura a ser compilado por cualquiera) La segunda versión del código Miré es la siguiente:
#include <iostream>
using namespace std;
extern "C"
{
typedef struct stuff
{
int x;
double y;
} things;
}
int main()
{
things jmcd;
jmcd.x = 12;
jmcd.y = 10.1234;
cout << jmcd.x << " " << jmcd.y << endl;
return 0;
}
Básicamente, de mirar el desmontaje, parece el primer ejemplo es en realidad más lento. Miré la salida de la asamblea y, bueno, debo estar un poco oxidado. Tal vez alguien podría darme una idea. La salida de montaje de la primera CPP compilado y parecía:
main:
.LFB957:
.cfi_startproc
.cfi_personality 0x0,__gxx_personality_v0
pushl %ebp
.cfi_def_cfa_offset 8
movl %esp, %ebp
.cfi_offset 5, -8
.cfi_def_cfa_register 5
subl $24, %esp
movl $0, 12(%esp)
movl $0, 16(%esp)
movl $0, 20(%esp)
movl $12, 12(%esp)
movl 12(%esp), %eax
movl %eax, 12(%esp)
fldl .LC0
fstpl 16(%esp)
fldl 16(%esp)
fstpl 16(%esp)
movl 12(%esp), %eax
movl %eax, 4(%esp)
fildl 4(%esp)
fldl 16(%esp)
faddp %st, %st(1)
fnstcw 2(%esp)
movzwl 2(%esp), %eax
movb $12, %ah
movw %ax, (%esp)
fldcw (%esp)
fistpl 4(%esp)
fldcw 2(%esp)
movl 4(%esp), %eax
leave
ret
.cfi_endproc
El segundo ejemplo parecía:
main:
.LFB957:
.cfi_startproc
.cfi_personality 0x0,__gxx_personality_v0
pushl %ebp
.cfi_def_cfa_offset 8
movl %esp, %ebp
.cfi_offset 5, -8
.cfi_def_cfa_register 5
subl $24, %esp
movl $12, 12(%esp)
fldl .LC0
fstpl 16(%esp)
movl 12(%esp), %eax
movl %eax, 4(%esp)
fildl 4(%esp)
fldl 16(%esp)
faddp %st, %st(1)
fnstcw 2(%esp)
movzwl 2(%esp), %eax
movb $12, %ah
movw %ax, (%esp)
fldcw (%esp)
fistpl 4(%esp)
fldcw 2(%esp)
movl 4(%esp), %eax
leave
ret
.cfi_endproc
Ambos fueron generados con un comando g++ -O0 -S main.cpp
. Claramente, el ejemplo intuitivamente menos eficiente generó un código de operación más eficiente en términos de número de instrucciones. Por otro lado, hay pocos casos en los que pueda imaginar que las pocas instrucciones sean críticas. (Por otra parte, realmente no tengo problemas para entender el montaje no está escrito por los seres humanos, así que tal vez me estoy perdiendo algo ...) Creo que esto proporciona una solución, aunque con retraso, a la pregunta formulada James. Lo próximo que debería probar es si se permite la misma inicialización en C99; si eso funciona, creo que aborda completamente el problema de James.
de responsabilidad: No tengo idea de si esto funciona o comporta de manera similar a cualquier otro compiladores distintos g ++.
Tenga en cuenta que inicializadores designados ahora trabajan en g ++. Tengo la versión 4.8.1 y podría usar los inicializadores de una enumeración y funcionó tal como se esperaba. –