rozmiar struktury zawierającej std::vector

0

Witam. Mam taką przykładową strukturę:
struct struktura
{
std::vector<int> wektor;
int liczba;
};
Dlaczego operator sizeof(struktura) zwraca mi w wyniku 40, kiedy sizeof(wektor)=32, oraz sizeof(liczba)=4. Gdzie podziewają się 4 dodatkowe bajty? W przypadku struktury z dwoma intami dostaję sumę, tzn. 8.

0

U mnie zwraca odpowiednio 20 i 16, czyli suma (16+4) się zgadza.
Ale przyczyną jest prawie na pewno tzw. alignment.

Gdzie podziewają się 4 dodatkowe bajty?
Marnują się. Live with it.

0

Dodatkowe bajty to zapewne padding. Kompilator układa sobie składniki klasy w taki sposób, żeby dostęp do nich był jak najefektywniejszy. Czasem oznacza to, że trzeba powstawiać takie dodatkowe pola pomiędzy składnikami. Nie przejmuj się tym, chyba, że jakoś bardzo zależy Ci na rozmiarze - chyba każdy kompilator ma opcje pakowania struktur.

http://en.wikipedia.org/wiki/Data_structure_alignment

0

Nie zależy mi na rozmiarze, ale chcę przepisać obiekt klasy do bufora i muszę wiedzieć kiedy kończy mi się wektor, a zaczyna int.

0

Jaki kompilator i dla jakiej architektury kompilacja? Strzelając: vector oczekuje wyrównania do 8 bajtów, struktura jest dopełniana tak żeby mu ją zapewnić (np. w tablicach). Ta wielokrotność może wynikać z rozmiaru pointera jeśli kompilujesz dla x64, bez informacji o kompilatorze i docelowej architekturze to ciężko coś konkretnego powiedzieć.

0

C++ Builder, Win7 x64.

0
Mariusz86 napisał(a):

Nie zależy mi na rozmiarze, ale chcę przepisać obiekt klasy do bufora i muszę wiedzieć kiedy kończy mi się wektor, a zaczyna int.
Musisz pokazać co dokładnie robisz, bo to co napisałeś jest bez sensu.

struktura s;
int *tu_zaczyna_sie_int = &s.liczba;
int *tu_konczy_sie_tablica_elementow_wektora = &*s.end();

Elementy wektora nie są częścią struktury struktura. Są w osobnym, dynamicznie alokowanym bloku pamięci.

0

Po co masz to widzieć? Przecież masz struktura.liczba i to przepisujesz gdzie chcesz.

0

Chcę stworzyć sobie bufor: char* bufor i wrzucić do niego najpierw inta, a potem kolejne zmienne z wektora. Co w tym bezsensownego?

0
Endrju napisał(a):

Po co masz to widzieć? Przecież masz struktura.liczba i to przepisujesz gdzie chcesz.

No tak, nie muszę :). Chwilowe zamroczenie. Ale przy okazji dowiedziałem się przynajmniej skąd mogą się brać dodatkowe bajty.

0

No to zrób to normalnie, po co Ci jakakolwiek wiedza o ułożeniu zmiennych w pamięci? Kopiujesz bajty tego inta a potem kolejne pozycje z wektora. :-o

0
Endrju napisał(a):

.. po co Ci jakakolwiek wiedza o ułożeniu zmiennych w pamięci? :-o

Nigdy nie wiadomo, kiedy ta wiedza może mi się przydać :).

0

No to zobacz co będzie jak ustawisz wyrównanie ręcznie:

#pragma pack(push, 1)
struct struktura
 {
   std::vector<int> wektor;
   int liczba;
};
#pragma pack(pop)
0
Mariusz86 napisał(a):

Nie zależy mi na rozmiarze, ale chcę przepisać obiekt klasy do bufora i muszę wiedzieć kiedy kończy mi się wektor, a zaczyna int.

Ale ty wiesz, że std::vector w twojej klasie to tak naprawdę obiekt, który zawiera wskaźnik na strukturę danych w zupełnie innym miejscu pamięci, wiec bezmyślny zapis danych do tego bufora nic ci nie da!

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