Optymalizacja po instrukcji "return"

1

Witam,

Opisuję drugi raz, ponieważ ktoś usunął mój wątek. Dlaczego?

Piszę program okienkowy w MSVC 2008 Express i przy włączonej optymalizacji (/O2) kompilator wycina mi kod po instrukcji return. Chciałby jednak aby kod po tej instrukcji był optymalizowany jednak aby nie był wyrzucany.
Da się takie coś osiągnąć? W jaki sposób?

2

A po jakiego grzyba Ci unreachable code, mistrzu? :|

0
heaven7 napisał(a):

Opisuję drugi raz, ponieważ ktoś usunął mój wątek. Dlaczego?

Nikt nic nie usunął: http://4programmers.net/Forum/Spolecznosc/Perelki/205174-optymalizacja_po_return_w_msv2008

Piszę program okienkowy w MSVC 2008 Express i przy włączonej optymalizacji (/O2) kompilator wycina mi kod po instrukcji return. Chciałby jednak aby kod po tej instrukcji był optymalizowany jednak aby nie był wyrzucany.
Da się takie coś osiągnąć? W jaki sposób?

ZASTANÓW SIĘ.

0

Związane to jest z inżynierią odwrotną, dlatego potrzebny mi kod po return.

0

Wyjaśnij po co właściwie chcesz to osiągnąć, bo w zależności od celu będzie kilka lepszych lub gorszych metod.

0

Można w taki sposób:

#pragma optimize( "g", off )
void func()
{
	return;
	printf("Hello");
}
#pragma optimize( "g", on )

Wyłączasz tylko część optymalizacji (akurat tą która wywala nieużywany kod, chociaż niestety nie tylko) i tylko dla pojedyńczej funkcji.

0
0x200x20 napisał(a):

Można w taki sposób:

#pragma optimize( "g", off )
void func()
{
	return;
	printf("Hello");
}
#pragma optimize( "g", on )

Wyłączasz tylko część optymalizacji (akurat tą która wywala nieużywany kod, chociaż niestety nie tylko).

Chociaż liczyłem właśnie jednak na jakąś inną możliwość, to i tak dzięki.

0

Jeśli potrzebujesz markera to zrób wstawkę ASM...

0

W tym problem, że wstawka asm po return też jest usuwana.

0

To zamiast tego return daj if (dupa) return; z tym, że dupa będzie ustawiana na true na starcie programu.

0

a sprobuj zrobic wstawke asm ktora zawiera return i uzyj asm volatile zamiast samego asm. Z tym ze stracisz wtedy optymalizacje

0
heaven7 napisał(a):
0x200x20 napisał(a):

Można w taki sposób:

#pragma optimize( "g", off )
void func()
{
	return;
	printf("Hello");
}
#pragma optimize( "g", on )

Wyłączasz tylko część optymalizacji (akurat tą która wywala nieużywany kod, chociaż niestety nie tylko).

Chociaż liczyłem właśnie jednak na jakąś inną możliwość, to i tak dzięki.

ale co ci się w tej nie podoba? - Azarien

Niestety nie działa to z funkcjami inline. Mogę oczywiście (w przypadku __forceinline) kod, który chcę wstawić po return, wstawić bezpośrednio po wywołaniu takiej funkcji, jednak w moim przypadku wpływa to bardzo niekorzystnie na czytelność kodu.

Wibowit napisał(a):

To zamiast tego return daj if (dupa) return; z tym, że dupa będzie ustawiana na true na starcie programu.

To nie takie proste, ja nie chce pominąć instrukcji return.

krwq napisał(a):

a sprobuj zrobic wstawke asm ktora zawiera return i uzyj asm volatile zamiast samego asm. Z tym ze stracisz wtedy optymalizacje

Niestety ale pozbycie się C++owego return na rzecz asma za bardzo komplikuje sprawę, a ponadto nie chcę robić dużych zmian w już napisanym kodzie. BTW. w MSVC 2008 wewnętrzny inline asembler chyba nie obsługuje oddzielnego słowa kluczowego volatile.

0

Raczej chodziło o coś takiego:

volatile bool zmienna = true;
void func()
{
	if(zmienna) return;
	printf("hello");
}

Jedyny minus jest taki, że kompilator niekoniecznie umieści printfa na końcu funkcji (aczkolwiek pewnie w większości przypadków tak zrobi).
W ogóle to napisz po co ci coś takiego bo mogę się założyć, że problem który rozwiązujesz da się w lepszy sposób rozwiązać.

0
0x200x20 napisał(a):

Raczej chodziło o coś takiego:

volatile bool zmienna = true;
void func()
{
	if(zmienna) return;
	printf("hello");
}

Jedyny minus jest taki, że kompilator niekoniecznie umieści printfa na końcu funkcji (aczkolwiek pewnie w większości przypadków tak zrobi).
W ogóle to napisz po co ci coś takiego bo mogę się założyć, że problem który rozwiązujesz da się w lepszy sposób rozwiązać.

Rozumiem, rzeczywiście dość dobry sposób z volatile i zmienną, dzięki. Generalnie potrzebuję "znacznika" binarnego po return, jednak nie wykluczam, że kod, który znajduje się po return może być w przyszłości wykonywany poprzez bezpośredni "skok" do niego z innego miejsca w programie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1