Это своего рода ответ и вопрос. Я понимаю, что эта нить мертва, но это именно то, что я искал сегодня вечером.
Я немного покопался и ближе всего смог получить то, что хочу (что похоже на то, что вы хотите ... Я работал с фотографиями, и мне не нужно использовать c ++, но мне любопытно, как это может быть сделано) это первый пример кода:
#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;
}
Это очень похоже на обозначенные инициализаторы стиля C99 с оговоркой, о которой я упомяну позже. (Вы, вероятно, обернули бы это в #ifdef __cplusplus, если бы вы хотели, чтобы структура была скомпилирована любым из них.) Вторая версия кода, на которую я смотрел, такова:
#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;
}
По сути, если посмотреть на разборку, то кажется, что первый пример на самом деле медленнее. Я посмотрел на результаты сборки и, ну, я должен быть немного ржавым. Может быть, кто-нибудь мог бы дать мне некоторое представление. Результат сборки первого cpp скомпилирован и выглядит так:
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
Второй пример выглядел так:
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
Оба они были созданы с помощью команды g++ -O0 -S main.cpp
. Очевидно, что интуитивно менее эффективный пример генерирует более эффективный код операции с точки зрения количества инструкций. С другой стороны, есть несколько случаев, когда я мог представить, что несколько инструкций являются критическими. (С другой стороны, у меня действительно проблемы с пониманием сборки, написанной не людьми, поэтому, может быть, я что-то упустил ...) Я думаю, что это дает решение, хотя и поздно, на вопрос, который задал Джеймс. Следующее, что я должен проверить, - разрешена ли такая же инициализация в C99; если это сработает, я думаю, что это полностью решит проблему Джеймса.
Отказ от ответственности: я понятия не имею, работает ли это или ведет себя аналогично для любых других компиляторов, кроме g ++.