Согласно этому примеру (левый пример)
#include <array>
#include <boost/container/static_vector.hpp>
struct X {
int k;
std::array<int, 4> a;
boost::container::static_vector<int, 4> b;
~X() = default;
};
int huh()
{
std::array<X, 5> x;
return 0;
}
похоже, что boost::container::static_vector<T, N>
является тривиально разрушаемым, когда T
(циклический цикл b
не происходиткогда X
уничтожается).huh
оптимизируется до xor eax, eax; ret
(то есть return 0
без зацикливания массива.
Когда я использую вместо этого содержащийся тип, который имеет нетривиальный деструктор (правый пример)
#include <array>
#include <boost/container/static_vector.hpp>
struct Y {
~Y();
};
struct X {
int k;
std::array<int, 4> a;
boost::container::static_vector<Y, 4> b;
~X() = default;
};
int huh()
{
std::array<X, 5> x;
return 0;
}
происходит цикл
add rbx, 1
call Y::~Y() [complete object destructor]
cmp rbx, r12
jne .L3
Я думаю, что это имеет смысл до сих пор. Память, занятая static_vector с тривиально разрушаемым объектом, может быть просто освобождена в постоянное время, независимо от того, сколько объектов на самом делесохранено.
Что меня удивляет, так это то, что значение std::is_trivially_destructible<boost::container::static_vector<int, 4> >::value
равно false. Это просто неверная черта типа?