Uno degli spazi dei nomi nel mio programma è distribuito tra due file. Uno fornisce il "motore", l'altro utilizza il "motore" per eseguire vari comandi. Tutte le inizializzazioni vengono eseguite sul lato "motore", inclusi i parametri di memorizzazione nella cache recuperati dalla libreria di installazione.Forza GCC a non ottimizzare una variabile non utilizzata?
Quindi, c'è engine.cpp
con:
#include <stdio.h>
#include "ns.h"
namespace MyNS
{
unsigned char variable = 0;
void init()
{
variable = 5;
printf("Init: var = %d\n",variable);
}
void handler()
{
// printf("Handler: var = %d\n",variable);
}
}
La variabile accade mai per essere riutilizzato in engine.cpp
ma che sia ampiamente utilizzato in commands.cpp
.
#include <stdio.h>
#include "ns.h"
namespace MyNS
{
extern unsigned char variable;
void command()
{
printf("Command: var = %d\n",variable);
}
}
Dopo la compilazione e il collegamento, sto ottenendo:
Init: var = 5
Comando: var = 1
Ora, se io rimuovere il commento le printf() in handler()
Ricevo:
Motore: var = 5
Comando: var = 5
Handler: var = 5
Quale sarebbe il modo "corretto" per forzare GCC non per ottimizzare la via in modo tale che l'accesso attraverso extern
dell'altro file sarebbe prendi il giusto valore? Preferibilmente senza ridurre il livello -O
per il resto dell'applicazione?
(per il caso di completezza, main.h
e ns.h
:)
#include "ns.h"
int main(int argc, char** argv)
{
MyNS::init();
MyNS::command();
MyNS::handler();
return 0;
}
namespace MyNS
{
void init();
void command();
void handler();
}
Questa testcase minimizzato non presenta questo comportamento particolare; sembra che sia necessario che questa situazione si verifichi in un ambiente molto più complesso ...
Non penso che il compilatore ottimizzerebbe 'variabile' via altrimenti non penso che il programma si colleghi. – Galik
Ho difficoltà a credere che un incarico a una variabile con collegamento esterno sarebbe stato ottimizzato. Sei sicuro che non sia la chiamata a 'init' che viene ottimizzata via? –
Il codice stamperebbe "Init: ..." piuttosto che "Engine: ...", suppongo che si riferiscano allo stesso caso. Comunque, questo è uno strano comportamento che mi fa meravigliare in che modo le altre funzioni influenzano la 'variabile'. –