Questa è una specie di risposta e domanda. Mi rendo conto che questo thread è morto, ma è esattamente quello che stavo guardando stasera.
Ho fatto un po 'di spiccioli e la cosa più vicina che posso ottenere in quello che voglio (che è simile a quello che vuoi ... Ho lavorato con le foto e non ho bisogno di usare il C++, ma sono curioso di sapere come potrebbe essere fatto) è il primo esempio di codice:
#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;
}
Questo ha un aspetto molto simile ai inizializzatori designati stile C99 con un avvertimento citerò più tardi. (. E 'probabile che questo avvolgere in #ifdef __cplusplus se si voleva la struttura per essere compilato da entrambi) La seconda versione del codice che ho guardato è questo:
#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;
}
In sostanza, guardando il disassemblaggio, sembra il primo esempio è in realtà più lento. Ho dato un'occhiata alla produzione del gruppo e, beh, devo essere un po 'arrugginito. Forse qualcuno potrebbe darmi qualche intuizione. L'uscita assemblaggio del primo cpp compilato e sembrava:
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
Il secondo esempio sembrava:
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
Entrambi questi sono stati generati con un comando g++ -O0 -S main.cpp
. Chiaramente, l'esempio intuitivamente meno efficiente ha generato un opcode più efficiente in termini di numero di istruzioni. D'altra parte, ci sono alcuni casi in cui potrei immaginare che le poche istruzioni siano critiche. (D'altra parte, ho davvero difficoltà a capire l'assemblaggio non scritto dagli umani, quindi forse mi manca qualcosa ...) Penso che questo fornisca una soluzione, anche se in ritardo, alla domanda che James ha posto. La prossima cosa che dovrei provare è se la stessa inizializzazione è permessa in C99; se funziona, penso che risolva completamente il problema di James.
Disclaimer: Non ho idea se questo funziona o si comporta in modo simile per qualsiasi altro compilatore diverso da g ++.
Nota che inizializzatori designati ora funzionano in g ++. Ho la versione 4.8.1 e potrei usare gli inizializzatori da un enum e ha funzionato esattamente come previsto. –