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)
这很安全.
[basic.types]/2:对于任何平凡复制的类型T,如果两个指针T指向不同T对象obj1和obj2,其中既不obj1也不obj2是碱基-类子对象,如果构成底层字节(1.7)obj1被复制到obj2,obj2随后应保持相同的值obj1.
由于double可以轻松复制,因此您的代码定义明确.