2017-07-16 10 views
6

C++ 14 intro.cpp Zjednoczone:Kiedy obiekt może zawierać jeden lub więcej bajtów pamięci masowej, ale nie oba?

a most derived object shall have a non-zero size and shall occupy one or more bytes of storage 

Dlaczego musieli stwierdzić

niezerowy rozmiar

i

jeden lub więcej bajtów przechowywanie

Kiedy może mieć jedną, ale nie drugą?

+0

1 bit będzie niezerowy rozmiar Chyba jednak nie byłby przynajmniej 1 bajt lub więcej pamięci ... to wszystko co mogę myśleć – Borgleader

+0

wielkości @Borgleader obiektu jest zawsze całkowita liczba bajtów. –

+0

@ n.m. Wiem o tym, ale może to część normy, która stwierdza, że ​​nigdy nie przeczytałem całej rzeczy. dlaczego inaczej określiliby niezerowy, a następnie "1 lub więcej bajtów"? Przejrzystość? – Borgleader

Odpowiedz

4

Dwie części mówią różne rzeczy.

obiekt większość pochodzi ma niezerową wielkości

Oznacza to sizeof użyciu obiektu powróci wielkość niezerową.

obiekt większość pochodzi ... powinien zajmować jeden lub więcej bajtów pamięci

oznacza to, że obiekt zajmuje kilka bajtów (jeden lub więcej) pamięci.

Jeśli druga instrukcja nie istnieje, może to oznaczać, że sizeof zgłasza niezerowy rozmiar, ale obiekt może nie używać żadnej pamięci.

Bez pierwszego stwierdzenia może to oznaczać, że sizeof może zwrócić zero, ale obiekt nadal zajmie miejsce w pamięci.

Obie są potrzebne i ortogonalne względem siebie.

+3

Jakie zastosowanie ma sizeof, jeśli nie zwraca liczby bajtów potrzebnych do przechowywania? – MikeMB

+3

@MikeMB - Pomyśl o "optymalizacji pustej bazy". Żadne miejsce przechowywania nie jest "naprawdę" zajmowane przez pod-obiekt. Właśnie dlatego nacisk na "najbardziej pochodną". – StoryTeller

+0

@ StoryTeller: Dobry przykład. Zapomniałem również o wyrównaniu/dopełnieniu. Myślę, że odpowiedź mogłaby zyskać dzięki krótkiemu wyjaśnieniu, jaki rozmiar zwrotów (miejsce potrzebne w tablicy) i dlaczego niekoniecznie jest to to samo, co zajmowane miejsce. – MikeMB

3

Istnieją przypadki, w których klasy mogą mieć niezerowej rozmiar (zwrócony przez sizeof), ale faktycznie nie zajmują żadnego miejsca w pamięci. Na przykład, Empty Base Optimization (EBO) stosuje się do wytwarzania części bazowej pochodzącej z obiektu nie zajmuje miejsca w pamięci, jak przedstawiono w przykładzie poniżej:

#include <stdio.h> 

struct Base {}; 

struct Derived : Base 
{ 
    int a; 
}; 

int main() 
{ 
    printf("sizeof(Base) = %d\n", sizeof(Base)); 

    Derived* p = new Derived; 
    void* p1 = p; 
    void* p2 = &p->a; 

    if(p1 == p2) { printf("Good compiler\n"); } 

    return 0; 
} 

skompilowany z gcc 4.8.4 Ubuntu 14,04 x64.

wyjściowa:

sizeof(Base) = 1 
Good compiler 
Powiązane problemy