如何从sockaddr_in6创建boost::asio::ip::address_v6而不进行额外复制



问题是address_v6类严格接受原始数据,因为bytes_type类:

typedef array< unsigned char, 16 > bytes_type;

sockaddr_in6结构没有,它有C风格的数组,不复制就无法转换为std::array。因此,我必须创建一个std::array,在那里复制数据,并将该数组传递给address_v6,后者将数据从该std::array复制到其内部缓冲区。

我希望我可以使用或实现一些C风格的数组查看器类,但无论如何我都无法将其传递给构造函数,因为它不是一个模板函数。

有没有办法在不制作额外数据副本的情况下创建address_v6

std::array必须是包含原始数组作为其第一个也是唯一一个非静态数据成员的结构体。由于原始数组包含unsigned chars,因此它是标准布局类。所以我无法从标准中找到以下代码不起作用的原因:

auto& bytearray = reinterpret_cast<std::array<unsigned char,16>&>(ipv6socket->sin6_addr.s6_addr); 

如果要复制,请将auto&替换为普通auto

std::array拥有自己的内存,无法创建视图并将其传递给std::array。没有必要这么做。在堆栈上分配std::数组并进行复制,这不是一个昂贵的操作,只需要复制16个字节。

最新更新