2013-08-22 11 views
7

Wiem, jak działa sizeof do obliczania rozmiaru struktur zawierających tylko elementy danych. Ale na przykład jeśli mam następujące struktury w C++Rozmiar struktur z funkcjami w C++

struct MyAdd() 
{ 
    int AddInt() 
    { 
     int a=5; 
     int b=5; 
     return a+b; 
    } 
    int c; 
    int d; 
}; 

tak dalej używając sizeof funkcji spowoduje to również powrót wielkości zmienne zadeklarowane wewnątrz funkcji AddInt czy będzie to tylko rozważyć zmienne składowe (c i d)?

+0

dlaczego nie spróbujesz uruchomić kodu? – nommyravian

+3

'sizeof' nie jest funkcją, jest operatorem. –

Odpowiedz

18

Będzie uwzględniać tylko zmienne składowe.

Ponadto, nie-wirtualne funkcje składowe nie przyczyniają się do rozmiaru struct, ponieważ nie wymagają żadnej obsługi w czasie wykonywania.

Aby zrozumieć, dlaczego tak jest, wyobraź sobie, że z punktu widzenia kompilatora widzenia kod ten jest bardzo podobny do tego Pseudokod:

struct MyAdd 
{ 
    int c; 
    int d; 
}; 

int MyAdd_AddInt(MyAdd* this) 
{ 
    ... 
} 
+0

Niewirtualne funkcje użytkownika _nie_nie przyczyniają się ... - nie ma reguły, która mówi, że nie przyczyniają się. – MSalters

+0

@MSalters: To prawda. Jednak znasz jakiś kompilator, który sprawia, że ​​przyczyniają się do wielkości instancji? –

2

Część kod funkcji (w tym zmiennych w tych funkcji) nie są liczone jako część rozmiaru dowolnego elementu danych.

Jeśli struktura ma funkcje wirtualne, może to zwiększyć rozmiar struktury.

Kompilator może również dodawać dopełnienie między elementami danych, aby zapewnić prawidłowe wyrównanie elementów w strukturze danych.

Innymi słowy, sizeof może wytwarzać rozmiar większy niż poszczególne elementy. Jednak żadne funkcje członkowskie nie będą uwzględniane w tym rozmiarze.

2

sizeof służy do obliczenia rozmiaru zajmowanej pamięci dla instancji tego typu. W przypadku wystąpień struct/class, funkcja nie zajmie dodatkowej pamięci (przechowywanej w segmencie tekstu) dla każdej instancji, podczas gdy elementy danych każdej instancji będą inne i potrzebują niezależnej pamięci (przechowywanej w segmencie danych rw).