ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
25 апреля
731153 Топик полностью
vmp (25.01.2017 23:36, просмотров: 256) ответил LightElf на Знатокам C:
Чем плох такой вариант? Проверял на IAR, оптимизирует полностью. typedef struct str_s { int a; int b; } str_t; str_t make_str_t(int a, int b) { str_t t; t.a = a; t.b = b; return t; } void foo(str_t s) { printf("a=%d\n", s.a); printf("b=%d\n", s.b); } void main(void) { foo(make_str_t(1, 2)); } Результат компиляции:
      1          typedef struct str_s
      2          {
      3            int a;
      4            int b; 
      5          } str_t;
      6          

   \                                 In section .text, align 2, keep-with-next
      7          str_t make_str_t(int a, int b)
      8          {
      9           str_t t;
     10           t.a = a;
     11           t.b = b;
     12           return t;
   \                     make_str_t: (+1)
   \   00000000   0xE9C0 0x1200      STRD     R1,R2,[R0, #+0]
   \   00000004   0x4770             BX       LR               ;; return
     13          }
     14          

   \                                 In section .text, align 2, keep-with-next
     15          void foo(str_t s)
     16          {
   \                     foo: (+1)
   \   00000000   0xB538             PUSH     {R3-R5,LR}
   \   00000002   0x460D             MOV      R5,R1
     17            printf("a=%d\n", s.a);
   \   00000004   0x4601             MOV      R1,R0
   \   00000006   0x.... 0x....      ADR.W    R0,`?<Constant "a=%d\\n">`
   \   0000000A   0x.... 0x....      BL       printf
     18            printf("b=%d\n", s.b); 
   \   0000000E   0x.... 0x....      ADR.W    R0,`?<Constant "b=%d\\n">`
   \   00000012   0x4629             MOV      R1,R5
   \   00000014   0xE8BD 0x402C      POP      {R2,R3,R5,LR}
   \   00000018   0x.... 0x....      B.W      printf
     19          }
     20          

   \                                 In section .text, align 2, keep-with-next
     21          void main(void)
     22          {
   \                     main: (+1)
   \   00000000   0xB580             PUSH     {R7,LR}
     23            //str_t st;
     24            //st.a = 1;
     25            //st.b = 2;
     26           // foo(st); 
     27            foo(make_str_t(1, 2));
   \   00000002   0x2101             MOVS     R1,#+1
   \   00000004   0x.... 0x....      ADR.W    R0,`?<Constant "a=%d\\n">`
   \   00000008   0x.... 0x....      BL       printf
   \   0000000C   0x.... 0x....      ADR.W    R0,`?<Constant "b=%d\\n">`
   \   00000010   0xE8BD 0x4004      POP      {R2,LR}
   \   00000014   0x2102             MOVS     R1,#+2
   \   00000016   0x.... 0x....      B.W      printf
     28          }

   \                                 In section .text, align 4, keep-with-next
   \                     `?<Constant "a=%d\\n">`:
   \   00000000   0x61 0x3D          DC8 "a=%d\012"
   \              0x25 0x64    
   \              0x0A 0x00    
   \   00000006   0x00 0x00          DC8 0, 0

   \                                 In section .text, align 4, keep-with-next
   \                     `?<Constant "b=%d\\n">`:
   \   00000000   0x62 0x3D          DC8 "b=%d\012"
   \              0x25 0x64    
   \              0x0A 0x00    
   \   00000006   0x00 0x00          DC8 0, 0