Đây là loại câu trả lời và câu hỏi. Tôi nhận ra chủ đề này đã chết, nhưng chính xác là những gì tôi đã nhìn vào tối nay.
Tôi đã làm một số điều thú vị và điều gần nhất tôi có thể đạt được những gì tôi muốn (tương tự như những gì bạn muốn ... Tôi đã làm việc với các bức ảnh và không cần sử dụng C++, nhưng tôi tò mò nó có thể được thực hiện) là ví dụ mã đầu tiên:
#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;
}
Điều này có vẻ rất giống với kiểu khởi tạo được chỉ định kiểu C99 với báo trước tôi sẽ đề cập sau. (. Bạn có lẽ sẽ quấn này trong #ifdef __cplusplus nếu bạn muốn các cấu trúc được biên soạn bởi một trong hai) Phiên bản thứ hai của mã Tôi nhìn là thế này:
#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;
}
Về cơ bản, từ cách nhìn vào tháo dỡ, nó xuất hiện ví dụ đầu tiên thực sự chậm hơn. Tôi đã xem xét sản lượng lắp ráp và, tốt, tôi phải có một chút gỉ. Có lẽ ai đó có thể cho tôi cái nhìn sâu sắc nào đó. Sản lượng lắp ráp của cpp đầu tiên biên soạn và trông giống như:
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
Ví dụ thứ hai trông giống như:
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
Cả hai được tạo ra với một lệnh g++ -O0 -S main.cpp
. Rõ ràng, ví dụ trực quan kém hiệu quả tạo ra opcode hiệu quả hơn về số lượng các hướng dẫn. Mặt khác, có vài trường hợp mà tôi có thể tưởng tượng ra một vài hướng dẫn rất quan trọng. (Mặt khác, tôi thực sự gặp khó khăn trong việc hiểu lắp ráp không được viết bởi con người, vì vậy có lẽ tôi đang thiếu một cái gì đó ...) Tôi nghĩ rằng điều này cung cấp một giải pháp, mặc dù muộn, cho câu hỏi James hỏi. Điều tiếp theo tôi nên kiểm tra là nếu cùng một khởi tạo được cho phép trong C99; nếu nó hoạt động, tôi nghĩ nó hoàn toàn giải quyết vấn đề của James.
Tuyên bố từ chối trách nhiệm: Tôi không biết liệu công cụ này có hoạt động hay hoạt động tương tự cho bất kỳ trình biên dịch nào khác ngoài g ++ hay không.
Lưu ý rằng initializers định bây giờ làm việc trong g ++. Tôi có phiên bản 4.8.1 và tôi có thể sử dụng initializers từ một enum và nó làm việc như mong đợi. –