Это своего рода и ответ, и вопрос. Я понимаю, что эта ветка мертва, но это именно то, что я искал сегодня вечером.
Я немного поковырялся и максимально приблизился к тому, что я хочу (что похоже на то, что вы хотите... Я работал с фотографиями и мне не нужно было использовать С++, но мне любопытно, как это можно сделать ) — первый пример кода:
#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++.
person
Andrew
schedule
12.07.2011