首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为包括对齐在内的多个缓冲区分配内存

为包括对齐在内的多个缓冲区分配内存
EN

Stack Overflow用户
提问于 2020-09-29 12:23:16
回答 1查看 165关注 0票数 1

我想为几种不同类型的连续数组分配内存。也就是说,就像这样,但是具有动态大小:

代码语言:javascript
复制
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,但是它是为了在您已经分配了内存之后找到放置它们的位置,所以在分配内存之前需要做一些努力。

,有什么简单的现成的方法来计算像这样的动态结构的大小和偏移量吗?,我在想象这样的函数

代码语言:javascript
复制
// 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);

例如:

代码语言:javascript
复制
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类型感兴趣;要全面通用地工作,我还需要处理异常安全的构造和破坏。)

EN

回答 1

Stack Overflow用户

发布于 2020-09-29 12:37:54

,有什么简单的现成的方法来计算这样的动态结构的大小和偏移量吗?

标准库中没有这样的功能。您可能可以在循环中使用std::align实现它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64119553

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档