回答另一个问题,我提出了一个解决方案,该解决方案使用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
对象obj1
和obj2
,其中 如果复制了构成obj1
的基础字节 (1.7(,则obj1
和obj2
都不是基类子对象 进入obj2
,obj2
随后应保持与obj1
相同的价值。
由于double
是可复制的,因此您的代码是明确定义的。
可以在未对齐的缓冲区之间复制。你不能做的是将缓冲区强制转换为双精度 *,然后直接对内存中的值进行操作,作为双精度。通常,由于对齐问题,这会导致错误。