c++ - 修改 const char* 数组的快速方法

标签 c++ performance pointers networking winpcap

我正在使用 Winpcap 库,但遇到性能问题。 当我调用

pcap_next_ex(fp, &header, &pkt_data) 

我在 pkt_data 处获得了一个 const char* 数组,其中包含数据包数据。

现在我想修改它的某些部分,所以我想出了这样的方法:

std::vector<char> send_pkt(pkt_data, pkt_data + header->caplen); 

(header->caplen 是数据包长度)现在我可以使用它,并将其发送下来。

但是,我的网络延迟高达 2000 毫秒,因此我在 VS 2013 上分析了代码,看起来这行代码占用了太多的 cpu 周期。我想这是因为数据包数组被完全复制到 vector 中。

所以我的问题是,如何快速修改原始 const char *pkt_data 数组?

非常感谢!

编辑:终于解决了问题。 winpcap 驱动程序造成了所有麻烦,因为它的 mintocopy 属性设置得太高(默认为 16000),因此在流量较低时(例如运行 ping),缓冲区未满,并产生延迟。 调用 pcap_setmintocopy(fp, 10) 就成功了。

对于数据包(const char *)修改,我成功地使用了下面提供的转换解决方案,尽管存在修改标记为常量的内容的风险,但它有效,现在我完美地实现了目标。

u_char * send_pkt = const_cast<u_char *>(pkt_data);

最佳答案

我会继续讲难以言表的事情:您可以从指针中丢弃 const,然后修改数据。当然,这样做你将进入未定义行为的领域,从而引入崩溃、错误结果、飞鼻守护进程等的可能性。但是编译器将允许你这样做,所以如果你绝望而无能为力else 就足够了,你可以尝试一下,看看会发生什么。请记住,即使它看起来可以在您的计算机上运行,​​但这并不意味着它一定可以在其他平台上运行。

不过,在做任何鲁莽的事情之前,我首先尝试一下:永久分配一个足够大的 char 数组,memcpy() 将 const 字符串放入该数组中,然后根据需要修改该数组。 memcpy() 非常高效,因为(与 vector 方法不同)它不需要任何动态分配或从堆中释放内存。看看这对您来说是否足够快。

关于c++ - 修改 const char* 数组的快速方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20943053/

相关文章:

c++ - 在模板类中使用排序 (C++)

c++ - 转换变量类型(或解决方法)

c++ - 据我所知,下面的函数不是 constexpr,而是用 clang 和 g++ 编译的代码。我错过了什么?

java - Android服务编辑

javascript - ANT Galio 浏览器性能问题

performance - 功能对齐在现代处理器上究竟有多重要?

c++ - 这是通过指针从 uint8_t vector 加载对象的安全方法吗?

c++ - 引用传递的参数的行为类似于拷贝

c++ - 为什么使用 `int (*p)[5]` 的结果如此困惑?

将指针的值更改为c函数中的指针