Sizeof and Containers

Can I use sizeof with std::string or std::vector? What does the value returned by sizeof represent in this case, given that containers can have variable lengths?

Yes, you can use sizeof with std::string or std::vector, but the result might not be what you expect.

When you use sizeof with a class type like std::string or std::vector, it returns the size of the object itself, not the size of the data it might be managing internally.

sizeof with Dynamically Allocated Data

std::string and std::vector are designed to handle dynamically allocated data. This means they typically store a pointer to the actual data (the characters of the string or the elements of the vector), which is stored elsewhere in memory (usually on the heap).

The size of this dynamically allocated data can change at runtime as you add or remove elements. However, the std::string or std::vector object itself has a fixed size, which includes things like:

  • A pointer to the dynamically allocated data
  • The current size of the data (how many elements are stored)
  • The capacity (how much memory has been allocated)

What sizeof Returns

When you call sizeof on a std::string or std::vector, you're getting the size of this fixed-size object, not the size of the dynamically allocated data.

Here's an example to illustrate this:

#include <iostream>
#include <string>
#include <vector>

int main() {
  std::string MyString{"Hello"};
  std::vector<int> MyVector{1, 2, 3, 4, 5};

  std::cout << "sizeof(std::string): "
    << sizeof(std::string) << " bytes\n";
  std::cout << "sizeof(MyString): "
    << sizeof(MyString) << " bytes\n";
  std::cout << "sizeof(std::vector<int>): "
    << sizeof(std::vector<int>) << " bytes\n";
  std::cout << "sizeof(MyVector): "
    << sizeof(MyVector) << " bytes\n";
}
sizeof(std::string): 40 bytes
sizeof(MyString): 40 bytes
sizeof(std::vector<int>): 32 bytes
sizeof(MyVector): 32 bytes

Example Explanation

On many 64-bit systems, you might see that sizeof(std::string) is 32 bytes and sizeof(std::vector<int>) is 24 bytes. These sizes will be the same regardless of the contents of the string or vector.

The actual string data ("Hello") and the vector data (1, 2, 3, 4, 5) are stored elsewhere in memory, and their sizes don't affect the result of sizeof applied to the std::string or std::vector object itself.

Getting the Size of Dynamically Allocated Data

If you want to know the number of elements in a std::vector, you should use the size() method. For std::string, you can also use size() or length(). These methods return the number of elements (or characters), which is different from the result of sizeof.

#include <iostream>
#include <string>
#include <vector>

int main() {
  std::string MyString{"Hello"};
  std::vector<int> MyVector{1, 2, 3, 4, 5};

  std::cout << "MyString.size(): "
    << MyString.size() << "\n";
  std::cout << "MyVector.size(): "
    << MyVector.size() << "\n";
}
MyString.size(): 5
MyVector.size(): 5

It's important to understand this distinction when working with dynamically sized containers. sizeof gives you the size of the container object itself, while size() or length() gives you the number of elements it's currently holding.

Numeric and Binary Data

Learn how C++ represents numbers and data in memory using binary, decimal, and hexadecimal systems.

Questions & Answers

Answers are generated by AI models and may not have been reviewed. Be mindful when running any code on your device.

Unsigned Ints vs std::byte
Why are unsigned integers preferred for representing binary data, even though std::byte exists?
Int Width and Portability
Why is the width of int not fixed in the C++ standard, and why does it matter for portability?
Bitwise Operations
How can I perform bitwise operations like AND or OR on variables storing binary data?
Extract Red Channel
How could I use bitwise operators to extract the red channel value from a uint32_t color variable?
Check Specific Bit
How would I check if a specific bit is set (equal to 1) within a uint8_t variable?
Or Ask your Own Question
Purchase the course to ask your own questions