struct SAaa { int i; int w; }; int main() { struct SAaa aaa = { 0 }; return 0; }Gdzieś doczytałem, że gdy w miejsce zera wstawię coś innego, to efekt będzie odmienny.
int main() { struct SAaa aaa = { 5 }; return 0; }Kompilacja, bez flag optymalizacji:
$ g++ main.cpp -m32 -masm=intel -SI to co wyprodukuje kompilator:
.file "main.cpp" .intel_syntax noprefix .text .globl main .type main, @function main: .LFB0: .cfi_startproc push ebp .cfi_def_cfa_offset 8 .cfi_offset 5, -8 mov ebp, esp .cfi_def_cfa_register 5 sub esp, 16 call __x86.get_pc_thunk.ax add eax, OFFSET FLAT:_GLOBAL_OFFSET_TABLE_ mov DWORD PTR -8[ebp], 0 mov DWORD PTR -4[ebp], 0 mov DWORD PTR -8[ebp], 5 mov eax, 0 leave .cfi_restore 5 .cfi_def_cfa 4, 4 ret .cfi_endproc .LFE0: .size main, .-main .section .text.__x86.get_pc_thunk.ax,"axG",@progbits,__x86.get_pc_thunk.ax,comdat .globl __x86.get_pc_thunk.ax .hidden __x86.get_pc_thunk.ax .type __x86.get_pc_thunk.ax, @function __x86.get_pc_thunk.ax: .LFB1: .cfi_startproc mov eax, DWORD PTR [esp] ret .cfi_endproc .LFE1: .ident "GCC: (Ubuntu 6.2.0-5ubuntu12) 6.2.0 20161005" .section .note.GNU-stack,"",@progbitsCóż, tego się nie spodziewałem - pewnie dlatego, że nigdy nie przebiłem się przez standard. Pierwsze pole dostaje piątkę, reszta nadal inicjowana jest zerami.
W dodatku (przez brak optymalizacji przy kompilacji), zapis do aaa.i będzie dwukrotny:
- aaa.i wypełnione "0" (linia 17)
- aaa.i wypełnione "5" (linia 19)
Brak komentarzy:
Prześlij komentarz