2015-08-19 12 views
8

Nie znalazłem lepszego sposobu sformułowania mojego pytania w ten sposób: Czy dane wyjściowe poniżej zawsze są prawdziwe? czy to jest przenośne?C++: Jak dalece (w bajtach) jest członkiem klasy w tablicy?

struct Point 
{ 
    int x; 
    int y; 
}; 

//... 
std::vector<Point> points(3); 
unsigned char* start = (unsigned char*)(&points[0]); 
unsigned char* end = (unsigned char*)(&points[1]); 

std::cout << "is this the same ? " << std::distance(start,end) == sizeof(Point); 

Co jeśli zamiast vector, points zostały zdefiniowane jako surowiec tablicy? Czy dane wyjściowe są zawsze prawdziwe?

Point *points = new Point[3]; // instead of std::vector<Point> points(3); 
+1

Tak. Przynajmniej wektor jest przechowywany w pamięci jako normalna tablica C. –

+1

Tak, gwarantowane jest przechowywanie jako tablica. [edytuj] ah Erik mnie pobił :-) – atlaste

+0

_ "Wszystkie komentarze zawierały coś w stylu ..." Tak, ponieważ o to właśnie prosiłeś. –

Odpowiedz

5

Na std::vector [vector.overview]/1 (N3337) mówi:

Elementy wektora są przechowywane sąsiadująco, co oznacza, że ​​jeśli v jest vector<T, Allocator> gdzie T jakiś rodzaj inny niż bool, to jest zgodny z tożsamością &v[n] == &v[0] + n dla wszystkich 0 <= n < v.size().

Tak, zachowanie Twojego programu jest przenośne i dobrze zdefiniowane.

Dla tablic [dcl.array]/1 stanowi:

obiektu typu tablicy zawiera ciągły przydzielony zbiór niepusty z N podobiektów typu T.

To nie jest tak wyraźny jak vector środki, ale jednoczesne użycie słowa „sąsiadujące” zwraca uwagę na fakt, że tożsamość std::vector składowania stosuje się również do tablic.

3

Tak, jednym z wymagań wektora jest to, że jego elementy muszą być przechowywane w sposób ciągły.

Z n2798:

23.2.6 szablon klasa wektorów [Wektor]

1 wektor jest pojemnik sekwencja, która umożliwia dostęp losowy iteratorami. Ponadto obsługuje (zamortyzowany) wstawienie czasu stałego i operacje kasowania na końcu; wstawianie i kasowanie w środku zajmuje czas liniowy . Zarządzanie pamięcią masową jest obsługiwane automatycznie, ale można podać podpowiedzi w celu poprawy wydajności. Elementy wektora to przechowywane w sposób ciągły, co oznacza, że ​​jeśli v jest wektorem, w którym T jest pewnym rodzajem , innym niż bool, to spełnia ono tożsamość & v [n] == & v [0] + n dla wszystkich 0 < = n < v.size().

+0

Czy to prawda dla surowego wskaźnika? (points = new Points (3);) – user1235183

+1

@ user1235183 masz na myśli 'Point * points = new Points [3];'? W takim przypadku tak. – TartanLlama

+0

tak i menat to. A twoje tak oznacza, że ​​jest dobrze zdefiniowane, przenośne i poprawne. – user1235183

Powiązane problemy