我正在编写一个相当简单的函数,它将数组发送到文件描述符。但是,为了发送数据,我需要附加一个一字节的标头。
这是我正在做的事情的简化版本,它似乎有效:
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__
根据他们的评论,我似乎找到了代码中看似随机崩溃的根本原因(这种情况很少发生,但仍然很烦人)。但是,对于如何解决它,我有点担心。
以下是我提出的解决方案:
使 buffer_to_send 本质上是一个固定长度的固定长度数组。我在这里能想到的问题是我必须使缓冲区与我想要发送的理论上最大的缓冲区一样大。在一般情况下,缓冲区要小得多,每次调用函数时我都会浪费大约 0.5KB。请注意,该程序必须在嵌入式系统上运行,虽然我不一定要计算每个字节,但我想使用尽可能少的内存。
使用 new 和 delete 或 malloc/free 动态分配缓冲区。这里的问题是该函数被频繁调用,并且在不断向操作系统请求内存然后释放它方面会有一些开销。
连续两次调用 write() 以将数据传递给文件描述符。也就是说,第一次写入将只传递一个字节,而下一次将发送缓冲区的其余部分。虽然看起来很简单,但我需要对代码进行更多研究(请注意,我从一位已经离开我工作的公司的以前的工程师那里得到了这个代码),以保证两个连续的写入是原子发生的。此外,如果这需要锁定,那么它本质上会变得更复杂,并且比案例 #2 对性能的影响更大。
请注意,我不能将 buffer_to_send 设为成员变量或将其范围限定在函数之外,因为在任何给定时间从各种线程(可能)多次调用该函数。
请让我知道您的意见以及我的首选方法应该是什么。谢谢你的时间。