/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
Bech_bb 500
kyllekylle 500
jdjespers.. 500
gibson 300
scootergr.. 300
molokyle 287
10  strarup 270
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.

Søg
Reklame
Statistik
Spørgsmål : 177429
Tips : 31962
Nyheder : 719565
Indlæg : 6407948
Brugere : 218878

Månedens bedste
Årets bedste
Sidste års bedste