|
| static i funktionsdefinition Fra : Troels Thomsen |
Dato : 20-02-06 16:14 |
|
Hej,
I min embedded IAR compiler reference står at hvis man erklærer en funktion
static, så sker der noget ...
( så kan compileren finde på at inline funktionen hvis optimizeren er
konfigureret dertil.)
static void updateSomething(void)
vs.
void updateSomething(void)
Betyder static i denne forbindelse noget generelt, eller er det forskelligt
fra compiler til compiler ?
tpt
| |
Troels Thomsen (20-02-2006)
| Kommentar Fra : Troels Thomsen |
Dato : 20-02-06 16:50 |
|
>
> Betyder static i denne forbindelse noget generelt, eller er det
> forskelligt fra compiler til compiler ?
>
Ahh selvfølgelig, det betyder scope.
"static single-use functions are great candidates for inlining"
Ja, _alle_ funktioner der kun bruges én gang er gode kandidater for inining,
uanset scope, imho.
Hvordan er det nu i C:
Hvis jeg har en funktion i et modul der kalder en funktion i et andet modul,
så bliver der genereret objektfiler for de to, og senere bliver de linket.
Dvs det er _umuligt_ for en compiler-linker toolchain at inline en funktion
fra et andet modul (c - fil) ?
Anderledes i C++ ?
(synes "nogen" har givet et eksempel der kunne tyde på det)
mvh Troels
| |
Soeren Sandmann (21-02-2006)
| Kommentar Fra : Soeren Sandmann |
Dato : 21-02-06 17:03 |
|
"Troels Thomsen" <asdf@asdf.dk> writes:
> Ahh selvfølgelig, det betyder scope.
>
> "static single-use functions are great candidates for inlining"
> Ja, _alle_ funktioner der kun bruges én gang er gode kandidater for inining,
> uanset scope, imho.
Det er ikke noedvendigvis en fordel at inline en funktion selvom den
kun bliver brugt een gang. Fx
static void
some_huge_function (void)
{
/* masser af kode */
}
static void
caller (void)
{
while (...)
{
/* something */
if (something_unlikely)
some_huge_function();
/* something else */
}
}
Hvis some_huge_function() bliver inlinet, risikerer man at caller ikke
laengere kan vaere i en enkelt cachelinje, hvilket vil give flere
cache-misses. I vaerste fald vil /* something */ og /* something else
*/ komme til at ligge paa to forskellige sider i hukommelsen.
Men hvis oversaetteren kan bevise at "kald af caller()" er
ensbetydende med "kald af some_huge_function()", saa er det helt
sikkert en fordel at inline.
| |
|
|