我想为几种不同类型的连续数组分配内存。也就是说,就像这样,但是具有动态大小:
template <typename T0, std::size_t N0, typename T1, std::size_t N1, ...>
struct {
T0 t0s[N0];
T1 t1s[N1];
...
};天真地,大小只是sizeof(T0) * N0 + sizeof(T1) * N1 + ...,但对齐使它棘手,我认为。您可以在alignof(T0)上对整件事情,然后在N0 T0s之后,您必须找出alignof(T1)点来启动T1s。这里有std::align,但是它是为了在您已经分配了内存之后找到放置它们的位置,所以在分配内存之前需要做一些努力。
,有什么简单的现成的方法来计算像这样的动态结构的大小和偏移量吗?,我在想象这样的函数
// Return the offsets in bytes of the ends of each array
template <typename... Ts>
std::array<std::size_t, sizeof...(Ts)>
calculateOffsets(const std::array<std::size_t, sizeof...(Ts)> sizes);例如:
auto offsets = calculateOffets<char, float>({3, 2});
// Offsets is now {4, 12} because the layout is [cccXffffFFFF] where c is a char, X is padding, f and F are the two floats.
// Now we can allocate a buffer of size offsets.back() with alignment alignof(char) and placement-new 3 chars starting at buf + 0, and 2 floats at buf + offsets.front()这很有趣,因为编译器显然内置了这个逻辑,因为在编译时,它知道上面的结构的布局是静态的。
(到目前为止,我只对POD类型感兴趣;要全面通用地工作,我还需要处理异常安全的构造和破坏。)
发布于 2020-09-29 12:37:54
,有什么简单的现成的方法来计算这样的动态结构的大小和偏移量吗?
标准库中没有这样的功能。您可能可以在循环中使用std::align实现它。
https://stackoverflow.com/questions/64119553
复制相似问题