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

max*_*x66 0 c++ memory-alignment memcpy

试图回答另一个问题,我提出了一个解决方案,用于std::memcpy()将通用类型存储在chars 的缓冲区中.

我怀疑存储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;
 }
Run Code Online (Sandbox Code Playgroud)

Tar*_*ama 5

这很安全.

[basic.types]/2:对于任何平凡复制的类型T,如果两个指针T指向不同T对象obj1obj2,其中既不obj1也不obj2是碱基-类子对象,如果构成底层字节(1.7)obj1被复制到obj2,obj2随后应保持相同的值obj1.

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