我有一个自定义二进制协议和二进制规范的消息。二进制协议为每条消息添加了一些标头。消息相对较大,包含近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个mircose。为什么访问一个字段需要很长时间?
答案 0 :(得分:2)
我的问题是,在整个消息中使用static_cast会导致解析
没有。 static_cast只告诉编译器被强制转换的指针所指向的内存内容应该被视为包含你所转换格式的数据。如果数据不是那种格式,那么很可能会出现垃圾。
如果您100%确定传入缓冲区包含正在投射的类型的正确数据,则这是一种访问数据的有效方法。但是,既然你谈论了消息和一个协议,我就会检查一下通信系统上的字节序,对齐,填充和单词化等内容是不会妨碍的。
此外,他对2个操作进行了定时,发现几乎没有时间进行static_cast,其中通过pointerToMessage.getFieldName()访问该字段大约需要120个mircose。为什么访问一个字段需要很长时间?
可能因为强制转换并不能做太多,实质上它只是创建一个指定类型的指针给你给它的内存地址。当您尝试阅读邮件内容时,会发生真正的访问。