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


为了

回答另一个问题,我提出了一个解决方案,该解决方案使用std::memcpy()将泛型类型存储在char s的缓冲区中。

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

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

如果是,是否可以编写类似的东西(将 POD 值存储在 char 缓冲区中(是安全的?又如何?

#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;
 }
这是

安全的。

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

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

可以在未对齐的缓冲区之间复制。你不能做的是将缓冲区强制转换为双精度 *,然后直接对内存中的值进行操作,作为双精度。通常,由于对齐问题,这会导致错误。

最新更新