Я хотел бы представить std::vector
структуры, содержащей несколько целых чисел, в виде "сплющенного" вектора целых чисел, без копирования данных .
Я пробовал что-то с reinterpret_cast
, как показано ниже:
#include <vector>
#include <iostream>
struct Tuple
{
int a, b, c;
};
int main()
{
// init
std::vector<Tuple> vec1(5);
for(size_t i=0; i<vec1.size(); ++i)
{
vec1[i].a = 3 * i + 0;
vec1[i].b = 3 * i + 1;
vec1[i].c = 3 * i + 2;
}
// flattening
std::vector<int>* vec2 = reinterpret_cast<std::vector<int>*>(&vec1);
// print
std::cout << "vec1 (" << vec1.size() << ") : ";
for(size_t i=0; i<vec1.size(); ++i)
{
std::cout << vec1.at(i).a << " " << vec1.at(i).b << " " << vec1.at(i).c << " ";
}
std::cout << std::endl;
std::cout << "vec2 (" << vec2->size() << ") : ";
for (size_t j = 0; j < vec2->size(); ++j)
{
std::cout << vec2->at(j) << " ";
}
std::cout << std::endl;
return 0;
}
, который хорошо работает, так как вывод:
vec1 (5) : 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
vec2 (15) : 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
Мои вопросы:
- Зависит ли это поведение от компилятора?(Я использую
g++ 6.3.0
) - Как
vec2
знает, что размер вектора равен 15
, а не 5
? - Есть ли какое-либо другое решение, позволяющее избежать использования
reinterpret_cast
?(Если я «случайно» добавлю double
член к Tuple
, возникшую проблему будет трудно отследить ...) - Если
vec1
имеет определенный распределитель:std::vector<Tuple,A<Tuple>>
, какой должен быть тип vec2
?std::vector<int>
или std::vector<int,A<int>>
или std::vector<int,A<Tuple>>
?