Skip to content

Instantly share code, notes, and snippets.

@cswiercz
Created July 17, 2015 20:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cswiercz/4d9e71c5500fb55cce27 to your computer and use it in GitHub Desktop.
Save cswiercz/4d9e71c5500fb55cce27 to your computer and use it in GitHub Desktop.
Differences in Vector Allocation / Deallocation between C++ Versions
[cswiercz@clavius vectors] clang++ ./construction.cpp && ./a.out
=========================
===== Experiment #1 =====
=========================
Resizing and new element construction
-- v.resize(3)
-- resizing members
[#0] constructed
[#1] constructed
[#2] constructed
-- v.capacity() = 3
-- v.resize(4)
[#3] copy constructed (from element [#2])
[#4] copy constructed (from element [#1])
[#5] copy constructed (from element [#0])
[#2] destroyed
[#1] destroyed
[#0] destroyed
===== END =====
[#3] destroyed
[#4] destroyed
[#5] destroyed
=========================
===== Experiment #2 =====
=========================
Using push_back.
-- v.resize(3)
-- pushing elements back
[#0] constructed
[#1] copy constructed (from element [#0])
[#0] destroyed
[#2] constructed
[#3] copy constructed (from element [#2])
[#2] destroyed
[#4] constructed
[#5] copy constructed (from element [#4])
[#4] destroyed
-- v.capacity() = 3
-- v.resize(4)
[#6] copy constructed (from element [#5])
[#7] copy constructed (from element [#3])
[#8] copy constructed (from element [#1])
[#5] destroyed
[#3] destroyed
[#1] destroyed
===== END =====
[#6] destroyed
[#7] destroyed
[#8] destroyed
[cswiercz@clavius vectors] clang++ --std=c++11 ./construction.cpp && ./a.out
=========================
===== Experiment #1 =====
=========================
Resizing and new element construction
-- v.resize(3)
-- resizing members
[#0] constructed
[#1] constructed
[#2] constructed
-- v.capacity() = 3
-- v.resize(4)
===== END =====
[#2] destroyed
[#1] destroyed
[#0] destroyed
=========================
===== Experiment #2 =====
=========================
Using push_back.
-- v.resize(3)
-- pushing elements back
[#0] constructed
[#1] moved (from element [#0])
[#0] destroyed
[#2] constructed
[#3] moved (from element [#2])
[#2] destroyed
[#4] constructed
[#5] moved (from element [#4])
[#4] destroyed
-- v.capacity() = 3
-- v.resize(4)
===== END =====
[#5] destroyed
[#3] destroyed
[#1] destroyed
=========================
===== Experiment #3 =====
=========================
Using emplace_back.
-- v.resize(4)
-- emplacing elements back
[#0] constructed
[#1] constructed
[#2] constructed
-- v.capacity() = 3
-- v.resize(4)
===== END =====
[#2] destroyed
[#1] destroyed
[#0] destroyed
#include <vector>
#include <iostream>
int NUM_INSTANCES = 0;
class InstanceCounter
{
int _instance_number;
public:
InstanceCounter()
{
_instance_number = NUM_INSTANCES++;
std::cout << "[#" << _instance_number << "] constructed\n";
}
InstanceCounter(const InstanceCounter& rhs)
{
_instance_number = NUM_INSTANCES++;
std::cout << "[#" << _instance_number << "] copy constructed ";
std::cout << "(from element [#" << rhs._instance_number << "])\n";
}
// move constructors not available before C++11
#if __cplusplus > 199711L
InstanceCounter(InstanceCounter&& rhs)
{
_instance_number = NUM_INSTANCES++;
std::cout << "[#" << _instance_number << "] moved ";
std::cout << "(from element [#" << rhs._instance_number << "])\n";
}
#endif
~InstanceCounter()
{
std::cout << "[#" << _instance_number << "] destroyed\n";
}
};
int experiment1(void)
{
NUM_INSTANCES = 0;
std::cout << "\n=========================\n";
std::cout << "===== Experiment #1 =====\n";
std::cout << "=========================\n";
std::cout << "Resizing and new element construction\n\n";
std::vector<std::vector<InstanceCounter> > v;
std::cout << "-- v.resize(3)\n";
v.resize(3);
std::cout << "-- resizing members\n";
v[0].resize(1);
v[1].resize(1);
v[2].resize(1);
std::cout << "-- v.capacity() = " << v.capacity() << "\n-- v.resize(4)\n";
v.resize(4);
std::cout << "\n===== END =====\n";
return 0;
}
int experiment2(void)
{
NUM_INSTANCES = 0;
std::cout << "\n=========================\n";
std::cout << "===== Experiment #2 =====\n";
std::cout << "=========================\n";
std::cout << "Using push_back.\n\n";
std::vector<std::vector<InstanceCounter> > v;
std::cout << "-- v.resize(3)\n";
v.resize(3);
std::cout << "-- pushing elements back\n";
v[0].push_back(InstanceCounter());
v[1].push_back(InstanceCounter());
v[2].push_back(InstanceCounter());
std::cout << "-- v.capacity() = " << v.capacity() << "\n-- v.resize(4)\n";
v.resize(4);
std::cout << "\n===== END =====\n";
return 0;
}
int experiment3(void)
{
// vector.emplace_back not availabe before C++11
#if __cplusplus > 199711L
NUM_INSTANCES = 0;
std::cout << "\n=========================\n";
std::cout << "===== Experiment #3 =====\n";
std::cout << "=========================\n";
std::cout << "Using emplace_back.\n\n";
std::vector<std::vector<InstanceCounter> > v;
std::cout << "-- v.resize(4)\n";
v.resize(3);
std::cout << "-- emplacing elements back\n";
v[0].emplace_back();
v[1].emplace_back();
v[2].emplace_back();
std::cout << "-- v.capacity() = " << v.capacity() << "\n-- v.resize(4)\n";
v.resize(4);
std::cout << "\n===== END =====\n";
#endif
return 0;
}
int main(int argc, char* argv[])
{
experiment1();
experiment2();
experiment3();
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment