C'est en quelque sorte une réponse et une question. Je réalise que ce fil est mort, mais c'est exactement ce que je regardais ce soir. J'ai fait quelques recherches et la chose la plus proche que je peux obtenir à ce que je veux (ce qui est similaire à ce que vous voulez ... J'ai travaillé avec des photos et je n'ai pas besoin d'utiliser C++, mais je suis curieux de savoir comment il pourrait être fait) est le premier exemple de code:
#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;
}
Cela a une apparence très similaire aux initialiseurs désignés de style C99 avec une mise en garde, je vais parler plus tard. (. Vous auriez probablement envelopper cette #ifdef __cplusplus si vous voulez que le struct à compiler soit) La deuxième version du code que je regardais est la suivante:
#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;
}
En fait, de regarder le démontage, il apparaît le premier exemple est réellement plus lent. J'ai regardé la sortie de l'assemblée et, bien, je dois être un peu rouillé. Peut-être que quelqu'un pourrait me donner un aperçu. La sortie de l'assemblage de la première cpp compilé et ressemblait à:
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
Le deuxième exemple ressemblait à:
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
Ces deux résultats ont été obtenus avec une commande g++ -O0 -S main.cpp
. Clairement, l'exemple intuitivement moins efficace a généré un code d'opération plus efficace en termes de nombre d'instructions. D'autre part, il y a peu de cas où je pourrais imaginer que les quelques instructions soient critiques. (D'un autre côté, j'ai vraiment du mal à comprendre l'assemblage non écrit par les humains, alors peut-être qu'il me manque quelque chose ...) Je pense que cela apporte une solution, quoique tardive, à la question posée par James. La prochaine chose que je devrais tester est si la même initialisation est autorisée en C99; Si cela fonctionne, je pense que cela répond parfaitement au problème de James. Disclaimer: Je n'ai aucune idée si cela fonctionne ou se comporte de la même manière pour tous les autres compilateurs autres que g ++.
Notez que les initialiseurs désignés travaillent maintenant en g ++. J'ai la version 4.8.1 et je pourrais utiliser des initialiseurs d'une énumération et cela a fonctionné comme prévu. –