我正在编写一个相当简单的函数,它将数组发送到文件描述符。但是,为了发送数据,我需要附加一个一字节标头。
这是我正在做的事情的简化版本,它似乎有效:
void SendData(uint8_t* buffer, size_t length) {
uint8_t buffer_to_send[length + 1];
buffer_to_send[0] = MY_SPECIAL_BYTE;
memcpy(buffer_to_send + 1, buffer, length);
// more code to send the buffer_to_send goes here...
}
就像我说的,代码似乎工作得很好,但是,我最近养成了使用 Google C++ 样式指南的习惯,因为我当前的项目没有为其设置样式指南(实际上我是我的项目中唯一的软件工程师)项目,我想使用工业中使用的东西)。我运行了 Google 的 cpplint.py,它捕获了我创建 buffer_to_send 的行,并抛出了一些关于不使用可变长度数组的评论。具体来说,这是 Google 的 C++ 风格指南中关于可变长度数组的内容......
http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Variable-Length_Arrays_and_alloca__ http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Variable-Length_Arrays_and_alloca__
根据他们的评论,看来我may已经找到了我的代码中看似随机崩溃的根本原因(这种情况很少发生,但仍然很烦人)。但是,我对如何解决它有点困惑。
以下是我提出的解决方案:
使 buffer_to_send 本质上是一个恒定长度的固定长度数组。我在这里能想到的问题是,我必须使缓冲区与我想要发送的理论上最大的缓冲区一样大。在一般情况下,缓冲区要小得多,每次调用函数时我都会浪费大约 0.5KB。请注意,该程序必须在嵌入式系统上运行,虽然我不一定计算每个字节,但我希望使用尽可能少的内存。
使用new和delete或malloc/free动态分配缓冲区。这里的问题是该函数被频繁调用,并且不断向操作系统请求内存然后释放它会产生一些开销。
使用两次连续调用 write() 将数据传递到文件描述符。也就是说,第一次写入将仅传递一个字节,下一次写入将发送缓冲区的其余部分。虽然看起来很简单,但我需要更多地研究代码(请注意,我从一位前工程师那里得到了这段代码,他后来离开了我工作的公司),以保证两次连续的写入以原子方式发生。此外,如果这需要锁定,那么它本质上会变得更加复杂,并且比情况 2 具有更大的性能影响。
请注意,我无法将 buffer_to_send 设置为成员变量或将其范围限制在函数之外,因为在任何给定时间,各个线程(可能)都会多次调用该函数。
请让我知道您的意见以及我首选的方法应该是什么。谢谢你的时间。
您可以使用 writev() 将选项 3 中对 write() 的两个连续调用折叠为单个调用。
http://pubs.opengroup.org/onlinepubs/009696799/functions/writev.html http://pubs.opengroup.org/onlinepubs/009696799/functions/writev.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)