What is the size of sizeof(vector)? C++
Categories:
Understanding sizeof(std::vector)
in C++: What Does It Measure?

Explore the true size of a std::vector
object in C++, differentiating between the size of the vector object itself and the memory it dynamically allocates for its elements.
When working with C++ std::vector
, a common point of confusion arises regarding its memory footprint, specifically what sizeof(std::vector)
actually returns. Unlike raw arrays, std::vector
is a dynamic container, meaning it manages its elements on the heap. The sizeof
operator, however, operates at compile time and only reports the size of the std::vector
object itself, not the memory it owns for its elements.
The sizeof
Operator and std::vector
The sizeof
operator in C++ returns the size, in bytes, of a type or a variable. For a std::vector
object, this size typically includes the member variables that std::vector
uses internally to manage its dynamic array. These usually consist of:
- A pointer to the beginning of the dynamically allocated memory (where elements are stored).
- The current number of elements (size).
- The total capacity of the allocated memory (capacity).
These three pieces of information are stored directly within the std::vector
object itself, which resides on the stack (if declared as a local variable) or within another object. The actual elements, however, are stored on the heap, and their memory is managed by the vector's internal mechanisms. sizeof
does not traverse pointers to report the size of pointed-to memory.
#include <iostream>
#include <vector>
int main() {
std::vector<int> myVector;
std::cout << "sizeof(std::vector<int>) = " << sizeof(myVector) << " bytes\n";
myVector.push_back(10);
myVector.push_back(20);
myVector.push_back(30);
std::cout << "After adding elements:\n";
std::cout << " sizeof(myVector) = " << sizeof(myVector) << " bytes\n";
std::cout << " myVector.size() = " << myVector.size() << " elements\n";
std::cout << " myVector.capacity() = " << myVector.capacity() << " elements\n";
std::cout << " Memory used by elements (approx) = " << myVector.capacity() * sizeof(int) << " bytes\n";
std::vector<double> anotherVector;
std::cout << "sizeof(std::vector<double>) = " << sizeof(anotherVector) << " bytes\n";
return 0;
}
Demonstrating sizeof(std::vector)
and its independence from element count.
Running the code above will typically show that sizeof(myVector)
remains constant regardless of how many elements are added to the vector. Its value will usually be 24 bytes on a 64-bit system (3 pointers/size_t variables * 8 bytes each) or 12 bytes on a 32-bit system (3 pointers/size_t variables * 4 bytes each). This confirms that sizeof
reports the size of the vector's internal management structure, not the data it holds.
graph TD A[std::vector Object (Stack/Heap)] -->|Contains| B(Pointer to Data) A -->|Contains| C(Size Variable) A -->|Contains| D(Capacity Variable) B --> E[Dynamically Allocated Data (Heap)] E --> F[Element 1] E --> G[Element 2] E --> H[...] subgraph sizeof(std::vector) A B C D end subgraph Memory Managed by Vector E F G H end
Visual representation of std::vector
memory layout and what sizeof
measures.
Why This Distinction Matters
Understanding this distinction is crucial for several reasons:
- Memory Footprint: If you need to know the total memory consumed by a
std::vector
(object + elements), you cannot rely solely onsizeof
. You would need to calculatesizeof(vector_object) + vector_object.capacity() * sizeof(ElementType)
. However,vector_object.capacity() * sizeof(ElementType)
is a more practical approximation for the dynamically allocated portion. - Performance: Copying a
std::vector
involves copying its internal pointers and size/capacity, then deep-copying all its elements. This is a much more expensive operation than copying a fixed-size array or a simple struct, wheresizeof
accurately reflects the total data being copied. - Serialization: When serializing a
std::vector
, you must serialize its elements, not just thestd::vector
object itself.sizeof
would only give you the size of the metadata, leading to data loss.
std::vector
(including its elements), use sizeof(myVector) + myVector.capacity() * sizeof(ElementType)
. Remember that capacity()
might be larger than size()
, indicating pre-allocated but unused memory.Impact of Compiler and Standard Library Implementation
The exact size returned by sizeof(std::vector)
can vary slightly between different compilers, standard library implementations (e.g., libstdc++ vs. libc++), and even compiler flags. This is because the C++ standard specifies the behavior of std::vector
but not its precise internal implementation details. However, the fundamental structure of holding a pointer, size, and capacity remains consistent, leading to a small, fixed size for the vector object itself.
#include <iostream>
#include <vector>
#include <string>
int main() {
std::vector<char> charVec;
std::vector<long long> llVec;
std::vector<std::string> stringVec;
std::cout << "sizeof(std::vector<char>) = " << sizeof(charVec) << " bytes\n";
std::cout << "sizeof(std::vector<long long>) = " << sizeof(llVec) << " bytes\n";
std::cout << "sizeof(std::vector<std::string>) = " << sizeof(stringVec) << " bytes\n";
// Even with different element types, the vector object size is often the same
// because it stores pointers/size_t, not the elements themselves.
return 0;
}
Comparing sizeof
for vectors with different element types.
As seen in the example, sizeof(std::vector<char>)
and sizeof(std::vector<long long>)
will likely yield the same result on a given system. This reinforces the idea that sizeof
measures the container's overhead, not the size of the contained data, which is managed separately on the heap.