#include <iostream>
#include <memory>
#include <vector>
using namespace std;
template <size_t N, size_t... Sizes>
struct total_extent {
static constexpr size_t value = N * total_extent<Sizes...>::value;
};
template <size_t N>
struct total_extent<N> { static constexpr size_t value = N; };
template <typename T, size_t... Sizes>
struct CTensor
{
// embed data into structure rather than using pointer to heap
T data[total_extent<Sizes...>::value];
// can use here: std::array<T, total_extent<Sizes...>::value> data;
};
template <typename T, size_t... Sizes>
void pass_by_ref(CTensor<T, Sizes...> &tensor, const CTensor<T, Sizes...> &tensor2)
{
// to avoid copying pass by ref
}
int main() {
// should fit into stack
CTensor<float, 3, 3, 3> stack_allocated;
// 64M floats better to allocate on heap
auto heap_allocated = std::make_unique<CTensor<float, 256,256,256>>();
// and we still can embed it into other data structures
std::vector<CTensor<float, 256, 256>> embedded_into_heap_allocated(2);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgojaW5jbHVkZSA8dmVjdG9yPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnRlbXBsYXRlIDxzaXplX3QgTiwgc2l6ZV90Li4uIFNpemVzPgpzdHJ1Y3QgdG90YWxfZXh0ZW50IHsKCXN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IHZhbHVlID0gTiAqIHRvdGFsX2V4dGVudDxTaXplcy4uLj46OnZhbHVlOwp9OwoKdGVtcGxhdGUgPHNpemVfdCBOPgpzdHJ1Y3QgdG90YWxfZXh0ZW50PE4+IHsgc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgdmFsdWUgPSBOOyB9OwoKCnRlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QuLi4gU2l6ZXM+CnN0cnVjdCBDVGVuc29yCnsKCS8vIGVtYmVkIGRhdGEgaW50byBzdHJ1Y3R1cmUgcmF0aGVyIHRoYW4gdXNpbmcgcG9pbnRlciB0byBoZWFwCglUIGRhdGFbdG90YWxfZXh0ZW50PFNpemVzLi4uPjo6dmFsdWVdOwoJLy8gY2FuIHVzZSBoZXJlOiBzdGQ6OmFycmF5PFQsIHRvdGFsX2V4dGVudDxTaXplcy4uLj46OnZhbHVlPiBkYXRhOwp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdC4uLiBTaXplcz4Kdm9pZCBwYXNzX2J5X3JlZihDVGVuc29yPFQsIFNpemVzLi4uPiAmdGVuc29yLCBjb25zdCBDVGVuc29yPFQsIFNpemVzLi4uPiAmdGVuc29yMikKewoJLy8gdG8gYXZvaWQgY29weWluZyBwYXNzIGJ5IHJlZgp9CgppbnQgbWFpbigpIHsKCS8vIHNob3VsZCBmaXQgaW50byBzdGFjawoJQ1RlbnNvcjxmbG9hdCwgMywgMywgMz4gc3RhY2tfYWxsb2NhdGVkOwoJCgkvLyA2NE0gZmxvYXRzIGJldHRlciB0byBhbGxvY2F0ZSBvbiBoZWFwCglhdXRvIGhlYXBfYWxsb2NhdGVkID0gc3RkOjptYWtlX3VuaXF1ZTxDVGVuc29yPGZsb2F0LCAyNTYsMjU2LDI1Nj4+KCk7CgkKCS8vIGFuZCB3ZSBzdGlsbCBjYW4gZW1iZWQgaXQgaW50byBvdGhlciBkYXRhIHN0cnVjdHVyZXMKCXN0ZDo6dmVjdG9yPENUZW5zb3I8ZmxvYXQsIDI1NiwgMjU2Pj4gZW1iZWRkZWRfaW50b19oZWFwX2FsbG9jYXRlZCgyKTsKCQoJcmV0dXJuIDA7Cn0=