【问题标题】:Store aligned data non aligned存储对齐数据非对齐
【发布时间】:2016-08-10 08:36:55
【问题描述】:

假设我有一个类 T 和一个数组:

uint8_t array[sizeof(T)];

需要注意的一点是array 的对齐方式可能与T 不兼容。

现在的问题是:有没有办法将T 存储在数组中(尽管存在对齐问题),前提是我们不尝试对T 做任何事情,直到我们从数组中复制它到正确对齐的存储空间?

换句话说,array 只是一个存储位置,直到我们需要访问T,在这种情况下,我们将其复制到正确对齐,并使用该值,然后将其复制回存储中。

注意:

T 可以很容易复制,但不能保证T 可以很容易复制......它可以是你能想到的任何类

所以.....这是否有可能(希望符合标准?)

【问题讨论】:

  • memcpy,如果T 是微不足道的?
  • 你需要的是序列化。那里有很多答案。

标签: c++ alignment


【解决方案1】:

这个问题正在演变,我不会通过相应地修改这个答案来跟踪它。

是的,对于可简单复制的对象,您可以使用memcpy,这在标准中的(非规范)示例中使用。

C++11 §3.9/2:

对于普通可复制类型T 的任何对象(基类子对象除外),无论该对象是否拥有T 类型的有效值,底层字节( 1.7)组成对象可以复制到charunsigned char的数组中。如果charunsigned char 数组的内容被复制回对象中,则该对象随后应保持其原始值。

对于模板代码,您可以通过std::is_trivially_copyable 检查一个类型是否可以轻松复制。

【讨论】:

  • 不幸的是,这不会被轻易复制(我将编辑我的问题以使其更清晰)
  • @DarthRubik:请提出一个新问题,而不是修改问题以使现有答案无效。
  • 放置 new 和移动构造函数?
  • @CaptainObvlious 不幸的是,如果对齐不正确,这是未定义的行为
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-16
  • 1970-01-01
  • 2017-10-02
  • 1970-01-01
  • 2015-09-14
  • 1970-01-01
  • 2015-07-31
相关资源
最近更新 更多