2016-03-30 50 views
5

Ho un codice della seguente struttura:Una funzione smette di essere in linea. Alcuna spiegazione?

void foo1(uint32_t *num_failures) 
{ 
    ... 
} 

void foo2(uint32_t *num_failures) 
{ 
    ... 
} 

void foo3(uint32_t *num_failures) 
{ 
    ... 
} 

void test() 
{ 
    uint32_t num_failures = 0; 
    foo1(&num_failures); 
    foo2(&num_failures); 
    foo3(&num_failures); 
} 

Ora, quello che ho fatto è stato aggiungere le seguenti istruzioni per foo1():

void foo1(uint32_t *num_failures) 
{ 
    ... 
    (*num_failures)++; 
} 

E d'un tratto vedo che dimensione dello stack stampata dall'interno foo2() è più grande di 36 byte.

Ho fatto un objdump e greped per <simboli>. Cedendo il seguente:

Prima della modifica:

... 
00004e08 <test>: 

Dopo il cambio:

... 
00004e08 <foo2>: 
00005588 <test>: 

Quindi credo che la funzione foo2 smesso di essere in linea.

  1. Sono corretto?
  2. Qualche spiegazione del motivo?
  3. Cosa è successo a foo3() dopo la modifica? È diventato incorporato all'interno di foo2() o all'interno di test()?

Non sono sicuro se richiesto: sto utilizzando gcc per il processore arc.

+0

Grazie Yu, non sapevo che fosse sbagliato. –

+0

Indovina: L'accesso (* num_failures) richiede una variabile locale. Il numero di registri o di dimensioni dello stack disponibili per 'test()' viene superato, quindi il compilatore lo dividerà nel successivo punto disponibile, che è foo2(). –

+1

Penso che in linea sia un suggerimento per il compilatore che può scegliere di ignorarlo. – Ant

risposta

1

Dopo aver appreso un po 'di più sull'argomento e aver visto alcune conferenze di Chandler Caruth, direi che il compilatore decide quasi indeterminatamente dove inserire il codice. Soprattutto quando non lo si denota alcun suggerimento "in linea", come nel mio caso.