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.
- Sono corretto?
- Qualche spiegazione del motivo?
- 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.
Grazie Yu, non sapevo che fosse sbagliato. –
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(). –
Penso che in linea sia un suggerimento per il compilatore che può scegliere di ignorarlo. – Ant