これは一種の答えであり、質問でもあります。このスレッドが死んでいることに気づきましたが、まさに今夜私が調べていたものです。
私はいくつかの突っ込みを行い、私が望むものに最も近いものを手に入れることができました(これはあなたが望むものに似ています... ) は最初のコード例です。
#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 でラップするでしょう。) 私が調べたコードの 2 番目のバージョンは次のとおりです。
#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
2 番目の例は次のようになります。
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 で同じ初期化が許可されているかどうかです。それが機能する場合、James の問題を完全に解決すると思います。
免責事項: g++ 以外の他のコンパイラでこれが機能するか、同様に動作するかどうかはわかりません。