2014-09-18 2 views
4

개체의 벡터와 함께 구조체와 개체 포인터의 벡터로 구조체의 크기 차이를 찾으려고합니다.벡터로 구조체의 크기

필자가 작성한 코드는 두 구조체의 크기가 이론적으로는 적어도 내용이 서로 다른 경우에도 동일하다는 것을 보여줍니다.

구조체의 내용을 기준으로 구조체의 정확한 크기를 찾는 올바른 방법은 무엇입니까?

#include <iostream> 
#include <string> 
#include <vector> 
using namespace std; 

struct Song{ 
    string Name; 
    string Artist; 
}; 

struct Folder{ 
    vector<Song*> list; 
}; 

struct Library{ 
    vector<Song> songs; 
}; 

int main(int argc, const char * argv[]) { 

    Library library; 
    Folder favorites; 
    Folder recentPurchaces; 

    library.songs.push_back(Song{"Human After All", "Daft Punk"}); 
    library.songs.push_back(Song{"All of my love", "Led Zepplin"}); 


    favorites.list.push_back(&library.songs[0]); 
    favorites.list.push_back(&library.songs[2]); 


    cout << "Size of library: " << sizeof(library) << endl; 
    cout << "Size of favorites: " << sizeof(favorites) << endl; 



    return 0; 
} 
+0

예상되는 실제 출력은 무엇입니까? – NPE

+0

내 예상 출력은 라이브러리가 즐겨 찾기보다 클 것이지만 둘 다 24 바이트라는 것을 보여줍니다. – user1721803

+0

'std :: vector <>'인스턴스의 크기는 저장되는 내용과 상관없이 동일하게 유지됩니다. 포함 된 모든 데이터는 힙으로 이동합니다. –

답변

3

는 다를 수 있습니다. 포인터의 몇 가지 구성되는 struct 저장 동안 만 "앵커"부분을 동적으로 할당 된 스토리지 std::vector<T> 데이터를 저장 :

아니, 크기가 다를 수해서는 안됩니다. 벡터 내부의 항목 수와 벡터 내부 항목의 크기는이 공간의 크기를 결정할 때 계산되지 않습니다.

메모리의 크기를 계산하려면 각 컨테이너 내부의 개별 항목의 크기를 더하고 컨테이너 자체의 용량에 컨테이너 항목의 크기를 더한 함수를 추가해야합니다.

+0

sizeof (object) + object.list.size() * sizeof (저장된 목록 유형)과 같은 내용이 있습니까? – user1721803

+1

@ user1721803 여러분의 필요에 따라'vector :: size()'대신'vector :: capacity()'가 필요합니다 – Paul

+1

@ user1721803 네,'size() 대신'capacity() '왜냐하면 용량은 항상 크기와 같기 때문입니다. 그러나 문자열이 문자열의 내용 크기를 계산하지 않는다는 점에 유의하십시오. 왜냐하면 문자열은 벡터 외부의 내용을 할당 할 수 있기 때문에 벡터와 유사하기 때문입니다. 문자열은 문자열 자체에 짧은 내용을 저장하도록 최적화 될 수 있기 때문에 더 까다 롭습니다. (편집 : 분명히, C++ 11 표준 이후). – dasblinkenlight

3

는 대부분의 경우, std::vector는 요소를 동적으로 할당 할 수있는 배열의 포인터를 유지하고, 그 포인터의 크기에 관계없이 Song* 또는 Song** 여부의 동일합니다. 물론 지적 된 메모리의 할당 된 크기는 다를 수 있습니다.

다른 말로하면 sizeof()std::vector에 필요한 메모리 양을 측정하는 좋은 방법이 아닙니다.

2

구조체의 크기가 다른 이유는 무엇입니까? std::vector은 동적 할당 ("힙 (heap)")을 통해 데이터를 저장하기 때문에 구현시 몇 가지 포인터가 포함될 이유가 없습니다.

정확한 구현 세부 사항은 물론, 표준 라이브러리 구현에 의존하지만, 일반적인 std::vector<T, Alloc>은이 같은 것을 포함 할 수있다 적어도 콘텐츠를 기반 이론에

template <class T, class Alloc = allocator<T>> 
class vector 
{ 
    T *_Begin, *_End, *_EndOfCapacity; 
    Alloc _Allocator; 
    // No other data members 

public: 
    /* ... */ 
}; 
+0

그 구조체 객체의 전체 크기를 찾고 싶습니다. 스택이나 힙에 상관없이 메모리에 객체가 차지하는 총 메모리 크기 – user1721803

+0

@ user1721803 그런 다음 적절하게 질문을 명확히하십시오. 'sizeof'는 객체 자체의 크기만을 제공합니다. – Angew