我的C ++有点生疏,因为我正在尝试编写一个fcgi处理程序。我想提供一个类来保存标题字段。由于标头来自套接字的char[]
并且是64位,我希望有一个构造函数,只需将前8个字节复制到实例数据中即可完成。虽然我对如何使用这个元素有一些想法,但我担心这可能导致64位机器上的多个复制操作。我还想使用初始化列表来防止默认构造开销(对于字符可能不存在)。由于我发现很难用文字描述这里是C ++中的问题,首先是类基本布局:
#include <boost/cstdint.hpp>
class header {
const boost::uint8_t version;
const boost::uint8_t type;
const union {
boost::uint16_t requestId;
struct {
boost::uint8_t requestIdB1;
boost::uint8_t requestIdB0;
};
};
const union {
boost::uint16_t contentLength;
struct {
boost::uint8_t contentLengthB1;
boost::uint8_t contentLengthB0;
};
};
const boost::uint8_t paddingLength;
const boost::uint8_t reserved;
header(char* header);
~header();
//utility methods/getter
};
现在必须编写构造函数。我可以这样写:
header::header(char* header) : version(header[0]), type(header[1]) , ..., reserver(header[7]) {}
但是,我担心这将涉及多个字节副本而不是一个8字节的Word副本。有没有更好的方法来写这个?我仍然希望能够编写header theHeader(&socketBuffer)
而不是header theHeader=&reinterpret_cast<header*>(&socketBuffer)
[socketBuffer是一个char []]。
考虑到C ++ 11,以下内容可能会有效,但我想知道是否有更好的方法。
C ++ 11在转换后转发到默认的复制构造函数:
header::header(char* header) : header(*reinterpret_cast<header*>(&socketBuffer)) {}