使用 std::memcpy 复制包含 boost::any 数据成员的对象
Using std::memcpy to copy an object that contains a boost::any data member
我正在尝试通过网络 API 传递包含 boost::any
数据成员的对象,以在两个应用程序之间交换数据。我知道 API 在内部使用 memcpy
来复制数据,但我不确定我想要做的是否是调用未定义的行为。
我写了一个简单的例子来演示如何使用 memcpy
:
#include <boost/any.hpp>
#include <cstring>
#include <string>
#include <iostream>
class Data
{
public:
template <typename T>
Data(T value)
: m_value(value)
{}
template <typename T>
T Read() const
{
return boost::any_cast<T>(m_value);
}
private:
boost::any m_value;
};
int main()
{
Data src(std::string("This is some data."));
std::cout << "Size: " << sizeof(src) << std::endl;
std::cout << "SRC: " << src.Read<std::string>() << std::endl;
void* dst = malloc(sizeof(src));
std::memcpy(dst, &src, sizeof(src));
const auto data = static_cast<Data*>(dst);
std::cout << "DST: " << data->Read<std::string>() << std::endl;
std::free(dst);
}
此代码似乎有效,并打印出以下输出:
Size: 8
SRC: This is some data.
DST: This is some data.
但是根据 Data
对象中存储的类型,大小不会改变吗?无论我使用什么类型,它总是打印大小为 8
.
这段代码是否调用了未定义的行为?如果是,我该如何修复它以便我可以正确 memcpy
一个包含 boost::any
数据成员的对象?
any
包含一个指针,并有一个析构函数,总的来说是你不想 memcpy
的东西。它在这里工作是因为 src
和 dst
都在同一内存中 space 并且因为你 free
在没有 运行 析构函数的情况下访问对象。
memcpy
any
持有的指向对象(any_cast
返回的对象)可能没问题。 memcpy
any
本身或包含它的对象绝对 不 可以。
我正在尝试通过网络 API 传递包含 boost::any
数据成员的对象,以在两个应用程序之间交换数据。我知道 API 在内部使用 memcpy
来复制数据,但我不确定我想要做的是否是调用未定义的行为。
我写了一个简单的例子来演示如何使用 memcpy
:
#include <boost/any.hpp>
#include <cstring>
#include <string>
#include <iostream>
class Data
{
public:
template <typename T>
Data(T value)
: m_value(value)
{}
template <typename T>
T Read() const
{
return boost::any_cast<T>(m_value);
}
private:
boost::any m_value;
};
int main()
{
Data src(std::string("This is some data."));
std::cout << "Size: " << sizeof(src) << std::endl;
std::cout << "SRC: " << src.Read<std::string>() << std::endl;
void* dst = malloc(sizeof(src));
std::memcpy(dst, &src, sizeof(src));
const auto data = static_cast<Data*>(dst);
std::cout << "DST: " << data->Read<std::string>() << std::endl;
std::free(dst);
}
此代码似乎有效,并打印出以下输出:
Size: 8
SRC: This is some data.
DST: This is some data.
但是根据 Data
对象中存储的类型,大小不会改变吗?无论我使用什么类型,它总是打印大小为 8
.
这段代码是否调用了未定义的行为?如果是,我该如何修复它以便我可以正确 memcpy
一个包含 boost::any
数据成员的对象?
any
包含一个指针,并有一个析构函数,总的来说是你不想 memcpy
的东西。它在这里工作是因为 src
和 dst
都在同一内存中 space 并且因为你 free
在没有 运行 析构函数的情况下访问对象。
memcpy
any
持有的指向对象(any_cast
返回的对象)可能没问题。 memcpy
any
本身或包含它的对象绝对 不 可以。