【发布时间】:2011-12-27 21:58:56
【问题描述】:
我有一个消息的自定义二进制协议和二进制规范。二进制协议为每条消息添加一些标头。该消息相对较大,包含近 50 个不同的字段。我的要求是在 linux 2.6.x 上使用 gcc 编译器从 c 或 c++ 中的二进制消息中仅解析 2 个字段。
一位开发人员创建了一个表示标头的类和另一个表示消息的 c++ 类。收到消息后,他只需在字节有效负载上使用 static_cast 即可返回消息类。一旦他得到消息对象类,他就简单地使用pointerToMessage.getFieldName() 来获取数据。
对上述段落的更正。开发人员为消息创建了一个结构,而不是一个类。该结构使用 gcc 的 __attribute__((__packed__ ))。
我的问题是,使用 static_cast 会导致整个消息被解析或者解析是否发生在访问时间,例如在 pointerToStruct.fieldName ? 此外,他对这 2 次操作进行了计时,发现几乎不需要任何时间来执行 static_cast,通过 pointerToStruct.fieldName 访问该字段大约需要 120 微秒。为什么访问一个字段需要很长时间?
【问题讨论】:
-
为什么static_cast会进行解析?
-
我很抱歉,因为我不是 c++ 开发人员并且编码的人不可用。于是就有了上面的问题。那么解析是在访问时发生的吗?
-
@Jimm :到目前为止,您所描述的一切都与解析无关。
-
消息解析必须在 getFieldName() 中进行 - 但它看起来很奇怪,如果我正确理解 static_cast 使用需要恒定长度的标头 - 或者至少必须以某种方式知道它的长度。