可变长度arrays性能影响(C / C ++)

我正在编写一个相当简单的函数,将数组发送到文件描述符。 但是,为了发送数据,我需要附加一个字节的头。

这是我正在做的简化版本,它似乎工作:

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__

基于他们的评论,似乎我可能已经找到了我的代码中看似随机崩溃的根本原因(这种情况很少发生,但仍然很烦人)。 但是,我对如何修复它有点不知所措。

以下是我提出的解决方案:

  1. 使buffer_to_send基本上是一个恒定长度的固定长度数组。 我能想到的问题是,我必须使缓冲区与我想要发送的理论上最大的缓冲区一样大。 在一般情况下,缓冲区要小得多,而且每次调用函数时都会浪费大约0.5KB。 请注意,程序必须在嵌入式系统上运行,虽然我不一定要计算每个字节,但我希望尽可能少地使用内存。

  2. 使用new和delete或malloc / free来动态分配缓冲区。 这里的问题是频繁调用该函数,并且在不断向操作系统询问内存然后释放它时会有一些开销。

  3. 使用两次连续的write()调用,以便将数据传递给文件描述符。 也就是说,第一次写入只传递一个字节,而下一次写入将发送剩余的缓冲区。 虽然看起来很简单,但我需要对代码进行更多的研究(请注意,我从之前离开我工作的公司的工程师处获得了此代码),以保证两次连续写入以primefaces方式发生。 此外,如果这需要锁定,那么它实际上变得更复杂并且比情况#2具有更多的性能影响。

请注意,我不能使buffer_to_send成为成员变量或将其作用于函数外部,因为在任何给定时间(可能)从各种线程调用该函数。

请让我知道您的意见以及我的首选方法。 谢谢你的时间。

您可以使用writev()将选项3中的两个连续调用write()折叠成一个调用。

http://pubs.opengroup.org/onlinepubs/009696799/functions/writev.html

我会选择选项1.如果您知道数据的最大长度,则使用固定大小的数组在堆栈上分配那么多空间(加上一个字节)。 这并不比你所显示的可变长度数组差,因为你必须总是在堆栈上留下足够的空间,否则你将无法处理最大长度(最坏的情况是,你的代码会在更大的缓冲区大小上随机崩溃) 。 在调用此函数时,没有其他任何东西可以使用堆栈上的其他空间,因此分配固定大小的数组是安全的。