Jak obliczyć wartość sizeof (struct) w C


Najlepsza odpowiedź

Dokładna sekwencja sizeof(struct) to błąd kompilacji w C. Zakładam, że pytasz, jak określić rozmiar konkretnego struct.

Ta odpowiedź brzmi nie podana bezpośrednio w definicji języka C. Jest to raczej funkcja ABI dla konkretnej architektury docelowej. (ABI oznacza Application Binary Interface).

Standard języka C określa kilka ogólnych zasad. Na przykład, jeśli masz struct z wieloma członkami, pierwszy członek będzie współdzielił adres z samym struct, a kolejni członkowie być pod wyższymi adresami.

Pola bitowe mają swój własny zestaw reguł. Nie będę ich tutaj podsumowywać.

W pierwszym zamówieniu rozmiar struct wyniesie co najmniej tak duże, jak suma rozmiaru jego członków (na razie ignorując pola bitowe). Elementy członkowskie mogą mieć ograniczenia wyrównania, a jeśli tak, środowisko może wprowadzić dopełnienie między elementami i dopełnienie na końcu struct.

Rozważmy następujące struct w architekturze, która wymaga 8-bajtowego wyrównania dla double wartości:

struct fun {

char a;

double b;

char c;

};

Zgodnie z zasadami języka C, musi znajdować się pod adresem wyższym niż a w każdym wystąpieniu struct fun. Podobnie c musi znajdować się pod adresem wyższym niż b.

W rezultacie ta konkretna struktura prawdopodobnie zajmuje 24 bajty, ze względu na ograniczenia wyrównania na b w tej architekturze. Ta sama struktura może wymagać tylko 16 bajtów w architekturze, która wymaga tylko 4-bajtowego wyrównania dla double.

Nie wierzysz mi?

Przekonaj się sam:

Ostatecznie musisz zapoznać się z ABI platformy docelowej, aby zrozumieć, w jaki sposób struct są pakowane razem dla tego celu.

Lub po prostu użyj sizeof jeśli nie obchodzi Cię to osobiście, ale Twój kod musi się przejmować.

Odpowiedź

Jak obliczyć wartość sizeof (struct) w C?

Nie. Kompilator tak.

Po pierwsze, sizeof(struct) to błąd składniowy. Prawdopodobnie zastanawiasz się, jak określić rozmiar typu konstrukcji lub obiektu tego typu. Ważne jest, aby być precyzyjnym. (Rozumiem, że usunięcie szczegółów pytania przez Quorę utrudnia to.)

Załóżmy, że masz typ struktury o nazwie struct foo i / lub obiekt tego typu o nazwie obj. Rozmiar typu to sizeof (struct foo), a rozmiar obiektu (który jest taki sam jak rozmiar jego typu) to sizeof foo . (Nawiasy są wymagane w pierwszym przypadku, a nie w drugim. W rzeczywistości istnieją dwie różne formy operatora sizeof. Jeden jest stosowany do nazwy typu w nawiasach, a drugi do wyrażenie, które często jest nazwą obiektu, ale nie zawsze.)

Możesz pomyśleć, że możesz obliczyć rozmiar struktury, dodając rozmiary jej elementów. Nie możesz. Kompilatory mogą i robią wstawianie wypełnienia między elementami i prawdopodobnie za ostatnim elementem, aby spełnić wymagania wyrównania. Rozmiar struktury to co najmniej suma rozmiarów jej elementów, ale jeśli potrzebujesz rozmiaru całej struktury, użyj po prostu sizeof. Do tego służy.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *