Numeric and Binary Data

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?

Abstract art representing computer programming

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.

Answers to questions are automatically generated and may not have been reviewed.

sdl2-promo.jpg
Part of the course:

Game Dev with SDL2

Learn C++ and SDL development by creating hands on, practical projects inspired by classic retro games

Free, unlimited access

This course includes:

  • 79 Lessons
  • 100+ Code Samples
  • 91% Positive Reviews
  • Regularly Updated
  • Help and FAQ
Free, Unlimited Access

Professional C++

Comprehensive course covering advanced concepts, and how to use them on large-scale projects.

Screenshot from Warhammer: Total War
Screenshot from Tomb Raider
Screenshot from Jedi: Fallen Order
Contact|Privacy Policy|Terms of Use
Copyright © 2025 - All Rights Reserved