普通旧数据和`std :: memcpy`对齐问题

时间:2016-10-03 13:23:10

标签: c++ memcpy memory-alignment

尝试回复another question,我提出了一个解决方案,使用std::memcpy()将通用类型存储在char s的缓冲区中。

我怀疑存储POD可能存在内存对齐问题(我知道非POD类型,如std::string,非常非常危险)。

简而言之:以下程序存在内存对齐问题?

如果它们是,那么可以写一些类似的东西(在char缓冲区中存储POD值)是安全的吗?怎么样?

#include <cstring>
#include <iostream>

int main()
 {
   char  buffer[100];

   double  d1 { 1.2 };

   std::memmove( buffer + 1, & d1, sizeof(double) );

   double  d2;

   std::memmove( & d2, buffer + 1, sizeof(double) );

   std::cout << d2 << std::endl;

   return 0;
 }

2 个答案:

答案 0 :(得分:5)

这是安全的。

  

[basic.types]/2:对于任何简单的可复制类型T,如果指向T的两个指针指向不同的T对象obj1obj2,   如果复制构成obj1的基础字节(1.7),则obj2obj1都不是基类子对象   进入obj2obj2随后应与obj1保持相同的值。

由于double可以轻易复制,因此您的代码定义明确。

答案 1 :(得分:3)

您可以复制到未对齐的缓冲区或从中复制。你不能做的是将缓冲区转换为double *然后直接操作内存中的值,作为double。由于对齐问题,通常会导致错误。