mam jakas funkcje:
int funkcja(){
puts("abc");
return 0;
}
iteraz chce poznac ile bajtow ona zajmuje (po skompilowaniu). Jak to zrobic?
mam jakas funkcje:
int funkcja(){
puts("abc");
return 0;
}
iteraz chce poznac ile bajtow ona zajmuje (po skompilowaniu). Jak to zrobic?
Nie da się. C++ nie udostępnia takiego mechanizmu. Teoretycznie ułożenie danych powinno być zgodne z kolejnością definicji ale nie jest to pewne, dla przykładu:
#include <iostream>
using namespace std;
int suma(int a, int b) {
return a + b;
}
void dummy() {}
int main() {
cout << (long)&dummy - (long)&suma << endl;
}
w wersji Debug pod Visualem da wynik ujemny, jedynie release działa zgodnie z założeniami. Do tego dochodzi wyrównanie adresów.
Na pewno w starym porcie gcc dla DOS, DJGPP to się chyba zwało, na ułożeniu można było polegać. O tyle jestem tego pewien, że było kilka makr, które się rozwijały w układ:
void funkcja_start() { }
int funkcja() { /* kod */ }
void funkcja_end() { }
// ....
int rozmiar_funkcji = (char*)funkcja_end - (char*)funkcja_start;
na GCC w trybie debug też to jako tako działa, ale jest to metoda - jak wskazał Deus - niepewna. Nic pewniejszego nie ma, chyba że twórcy gcc znowu z nudów jakieś extension napisali, albo Microsoft ma jakieś bydle zaszyte głęboko i nieudokumentowane.
iteraz chce poznac ile bajtow ona zajmuje (po skompilowaniu)
1.Jak po skompilowaniu to można użyć deasemblera i dokładnie obejrzeć sobie funkcję,
na podstawie adresów obliczyć rozmiar kodu .
Ps. faktem jest nie istnieje coś takiego jak sizeof(fun) -sizeof(&fun) zwróci rozmiar danej zawierającej adres fun .
sizeof jest obliczane w trakcie kompilacji i "wklejane" do kodu na sztywno .
ps.2
Jeśli chcesz uzyskać przybliżony rozmiar kodu fun w C,C++ to mozna wywołać
fun z etykietami __asm które ( i tak trzeba potem przeanalizować kod i dodać parę bajtów)
określą rozmiar kodu pomiędzy prologiem i epil . fun który musi być ustalony na podstawie
kodu który generuje kompilator ,,,
[podstawową wada rozwiązania to że fun musi zostać wywołana podczas działania programu oraz dodatkowo zwrócić wartość określającą rozmiar kodu - czyli
nie jest to "sizeof"]
Tyle wiem na ten temat , bez asemblera się raczej nie obędzie ,,,
Patrz punkt 1 .
Ps.3
sizeof(funkcja)
Mylący i źle dobrany temat dla wątku ....
// moderatorzy czuwają ,,, ;-)